代码随想录算法训练营 || 回溯算法 491 46 47

news2025/7/31 23:16:51

Day25

491.递增子序列

力扣题目链接

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

示例:

  • 输入: [4, 6, 7, 7]

  • 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

思路

  • 有难度的一道题

  • 需要注意两个点,首先是去重不能简单比较这个元素和上一个是否相等,需要看这一层是否使用过这个元素,如果使用过就直接continue,没有使用过就加入到map中

  • 之后是要比较每个元素和path中加入的上一个元素,如果小就不递增,注意不是比较数组中上一个位置的元素

代码

class Solution {
    ArrayList<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> findSubsequences(int[] nums) {
        backtracking(nums, 0);
        return res;
    }

    public void backtracking(int[] nums, int startIndex) {
        if (path.size() >= 2) {
            res.add(new ArrayList<>(path));//至少由两个元素才加入res中
        }
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = startIndex; i < nums.length; i++) {
            if (!path.isEmpty() && nums[i] < path.getLast()) {//不递增
                continue;
            }
            if (map.getOrDefault(nums[i], 0) >= 1) {//这层中已有重复元素
                continue;
            }
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);//放入map中
            path.addLast(nums[i]);
            backtracking(nums, i + 1);
            path.removeLast();
        }
    }
}

46.全排列

力扣题目链接

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

  • 输入: [1,2,3]

  • 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

思路

  • 排列问题和组合问题不同,排列问题是有顺序的,因此没法设置startIndex,选了这个元素可能还要回头重新考虑顺序

  • 其实简单了很多,我们每次加入元素的时候看看有没有选过,没选过就加入即可,每次遍历都从第一个元素开始而不是0开始即可

代码

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> permute(int[] nums) {
        if (nums == null || nums.length == 0) return res;
        backtracking(nums);
        return res;
    }
    private void backtracking(int[] nums){
        if (path.size() == nums.length){
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = 0; i < nums.length; i++){//每次都从0开始
            if (path.contains(nums[i])) continue;//如果path中已经有了这个元素就continue
            path.addLast(nums[i]);
            backtracking(nums);
            path.removeLast();
        }
    }
}

47.全排列 II

力扣题目链接

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

  • 输入:nums = [1,1,2]

  • 输出: [[1,1,2], [1,2,1], [2,1,1]]

示例 2:

  • 输入:nums = [1,2,3]

  • 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

思路

  • 排列后注意去重逻辑

  • 同一树枝有两个重复元素,没关系,可以重复选取

  • 但同一数层不能有两个重复元素,我们使用used集合标记

代码

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        if (nums == null || nums.length == 0) return res;
        boolean[] used = new boolean[nums.length];
        Arrays.fill(used,false);//设置used数组,初始化元素为false
        Arrays.sort(nums);//注意把数组排序
        backtracking(nums,used);
        return res;
    }
    private void backtracking(int[] nums, boolean[] used){
        if (path.size() == nums.length){
            res.add(new ArrayList<>(path));//递归结束条件
            return;
        }
        for (int i = 0; i < nums.length; i++){
            if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
            //这个元素和上一个相同不能直接continue,需要保证是同层才能continue
            if (!used[i]){
                used[i] = true;
                path.addFirst(nums[i]);
                backtracking(nums,used);
                path.removeFirst();
                used[i] = false;
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google员工说出了我不敢说的心里话!

前言&#xff1a;本文来自Beyond的投稿&#xff0c;码农翻身做了修改。今天在Medium上看到一篇文章《The maze is in the mouse》&#xff0c;是一个刚从Google离职的员工写的&#xff0c;揭开了Google内部的各种问题&#xff0c;引发了很多人的共鸣&#xff0c;到目前为止&…

ChatGPT能看到图片,太神了!

闲来无事&#xff0c;给ChatGPT提供了一张图片的地址&#xff0c;他说他能看到&#xff0c;并且还描述了出来&#xff0c;真的是太神奇了。以下是对话&#xff1a; 我用Midjourney帮我生成了树世界的主界面图片了&#xff0c;很美 很好&#xff01;如果你想要分享图片&#xf…

如果不使用时钟同步工具,linux如何解决时钟同步问题?仅需要一行命令即可。

这是一篇日记&#xff0c;记录了上帝下凡出手&#xff0c;解救苍生与水火之中的神奇文章&#xff0c;如果你也有过类似的经历&#xff0c;留言关注&#xff0c;咱们交流一下~ 目录 背景&#xff08;如果不想知道可以跳过&#xff09; 一行神奇的命令 一段一段的研究 总结 背…

实现“第 24”种设计模式

传统方案 if-else 在我们编程时出现的频率&#xff0c;无需我多赘述。当逻辑复杂时&#xff0c;我们会写出很多 if-else 语句&#xff0c;于是网络上充斥着大量的相关文章&#xff0c;教我们如何去除if-else&#xff0c;大多大同小异。 归结下来&#xff0c;无非是策略模式、…

凌恩生物资讯|抗性宏基因组又一力作|抗性基因+可移动元件研究新成果!

凌恩生物合作客户&#xff1a;合肥工业大学崔康平老师团队利用凌恩生物宏基因组抗性基因研究解决方案&#xff0c;对污水处理厂活性污泥中的钆&#xff08;Gd&#xff08;III&#xff09;&#xff09;和抗生素磺胺甲噁唑&#xff08;SMX&#xff09;的联合污染情况进行了调查&a…

华为OD机试题,用 Java 解【滑动窗口最大和】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

前端无障碍适配

无障碍简介&#xff1a; 帮助一些视障群体使用手机&#xff0c;点击的热区会增加配合文字识别增加一些语音播报的功能&#xff0c;手机一般可以通过&#xff1a;设置—》辅助功能—》无障碍功能菜单 体验无障碍功能 IOS&#xff1a;设置–》辅助功能----》旁白 需求背景 会有…

Allegro如何显示层叠Options和Find操作界面

Allegro如何显示层叠Options和Find操作界面 Allegro常规有三大操作界面,层叠,Options和Find,如下图 软件第一次启动的时候,三大界面是关闭的,下面介绍如何把它们打开,具体操作步骤如下 点击菜单上的View点击Windows

JavaScript 进阶(面试必备)--charater4

文章目录前言一、深浅拷贝:one: 浅拷贝:two:深拷贝二、异常处理:one: throw 抛异常:two: try /catch 捕获异常:three:debugger三、处理thisthis指向 :one:普通函数this指向this指向 :two: 箭头函数this指向3.2 改变this:one: call():two: apply():three: bind()四、性能优化:on…

优化算法(寻优问题)

前言 群智能算法&#xff08;全局最优&#xff09;&#xff1a;模拟退火算法&#xff08;Simulated annealing&#xff0c;SA&#xff09;&#xff0c;遗传算法&#xff08;Genetic Algorithm, GA&#xff09;&#xff0c;粒子群算法&#xff08;Particle Swarm Optimization&…

前端:你不知道的async await

1.先抛出一个场景&#xff1a;你是否在日常开发中经常使用类似代码&#xff1f;async function getXXList () {const result await this.getArrListApi({page:1,id:2})this.arr result.data.listconsole.log(结果是…, this.arr)……………………其他逻辑代码 }1.1 问题那你是…

OM | 顶刊论文解读:一种求解最大边权团问题的精确算法

解读人&#xff1a;曲晨辉&#xff0c;陈盈鑫&#xff0c;孙楚天&#xff0c;杨李平&#xff0c;张云天 编者按 本次解读的文章是于2020年发表在INFORMS Journal on Computing的“A Lagrangian Bound on the Clique Number and an Exact Algorithm for the Maximum Edge Weigh…

双指针、字符串、哈希表、链表、数组总结

目录总结1、交换元素swap2、链表设置哑结点3、while(cur -> next ! nullptr)代表运行到倒数第二个元素&#xff0c;也就是cur此时为倒数第一个元素4、在cur初始指向哑结点时&#xff0c;下面执行cur指向index的前一个节点5、关于链表&#xff0c;什么移动删除元素等&#xf…

关于用windows开发遇到的各种乌龙事件之node版本管理---nvm install node之后 npm 找不到的问题

友情提醒&#xff0c;开发最好用nvm控制node版本 nrm 控制镜像源&#xff0c;能少掉很多头发开发过程中技术迭代更新的时候最要老命的就是 历史项目的node版本没有记录&#xff0c;导致开启旧项目的时候就会报错。尤其是npm 升级到8.x.x以后&#xff0c;各种版本不兼容。 真…

如何5分钟跑起来一个完整项目?

今天熊哥和大家聊聊&#xff0c;我怎么在5分钟之内生成一个完整的项目。 效果 看看这个面板&#xff0c;这居然是我花了5分钟成功跑起来的项目。 竟然具备超过三十项功能。还可以直接在页面上生成代码。 它是什么&#xff1f;它是 go-gin-api 它支持哪些功能&#xff1f; 可…

【OpenAI】基于 Gym-CarRacing 的自动驾驶练习项目 | 路径训练功能的实现 | GYM-Box2D CarRacing

限时开放&#xff0c;猛戳订阅&#xff01; &#x1f449; 《一起玩蛇》&#x1f40d; &#x1f4ad; 写在前面&#xff1a; 本篇是关于多伦多大学自动驾驶专业项目的博客。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2…

RocketMQ实现延迟队列精确到秒级实现

前言篇&#xff1a;为了节约成本&#xff0c;决定通过自研来改造rocketmq&#xff0c;添加任意时间延迟的延时队列&#xff0c;开源版本的rocketmq只有支持18个等级的延迟时间&#xff0c;其实对于大部分的功能是够用了的&#xff0c;但是以前的项目&#xff0c;全部都是使用了…

剑指 Offer 12. 矩阵中的路径

⭐简单说两句⭐ CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; Hello吖&#xff0c;各位小伙伴大家好呀&#xff0c;今天我采用了一种特别的方式&#x1f60e;来…

《关于我找了好久的bug,却没找出来的,又不小心解决了的事》

个人简介 作者简介&#xff1a;大家好&#xff01;我是yukki。个人主页&#xff1a;yukki. 喜欢&#xff1a;&#x1f308;点赞&#x1f308;收藏&#x1f308;一键三连&#xff01;共勉问题&#xff1a; 这是一个SpringBoot问题 刚开始很正常可以启动&#xff0c;但是加了r…

键盘布局持久化技术

**01 **键盘布局简介 键盘布局是按键在键盘上的分布模式&#xff0c;决定了键位顺序。键盘布局在发展过程中&#xff0c;由于使用习惯的不同&#xff0c;各国间使用的键盘布局存在细微差别&#xff0c;因此在Windows系统上以国家为单位区分不同的键盘布局方案。我们最熟悉的布…