回溯算法05(leetcode491/46/47)

news2024/12/21 2:08:08

参考资料:

https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html

491. 非递减子序列

题目描述:

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

思路分析:

代码实现:

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path=new ArrayList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
        backTracking(nums,0);
        return res;
    }
    public void backTracking(int[] nums,int start){
        //不用写终止条件,后面for循环自动判断
        if(path.size()>1){
            res.add(new ArrayList<>(path));
            // return;//不用return,因为每个除第一层节点不收集以外,其他节点都收集
        }
        HashSet<Integer> hs=new HashSet<>();//每层递归都是新的,——>树层去重
        for(int i=start;i<nums.length;i++){
            if(!path.isEmpty() && nums[i]<path.get(path.size()-1) || hs.contains(nums[i])){
                continue;//此时是同一层递归取数的过程,所以continue,还可以往后选数
            }
            hs.add(nums[i]);
            path.add(nums[i]);
            backTracking(nums,i+1);
            path.remove(path.size()-1);
            //hs不用回溯,因为还在同一层中,要用于树层去重
        }

    }
}

 46. 全排列

题目描述:

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

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

思路分析:

代码实现:

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permute(int[] nums) {
        if(nums.length==0) return res;
        used=new boolean[nums.length];
        backTracking(nums);
        return res;
    }

    public void backTracking(int[] nums){
        if(path.size()==nums.length){
            res.add(new ArrayList<>(path));
            return;
        }

        for(int i=0;i<nums.length;i++){
            if(used[i]) continue;
            
            used[i]=true;
            path.add(nums[i]);
            backTracking(nums);
            path.removeLast();
            used[i]=false;
        }
    }
}

 47. 全排列 II

题目描述:

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

示例 1:

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

思路分析:

代码实现:

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permuteUnique(int[] nums) {
        if(nums.length==0) return res;
        used=new boolean[nums.length];
        Arrays.sort(nums);
        backTracking(nums);
        return res;
    }
    
    public void backTracking(int[] nums){
        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;//树层去重
            if(used[i]) continue;
            used[i]=true;
            path.add(nums[i]);
            backTracking(nums);
            path.removeLast();
            used[i]=false;
        }
    }
}

总结:

1. 根据题目要求看是否需要排序

2.树层去重(同一层递归):

1)可排序,用used[]数组记录 

        i>0 && num[i]==num[i-1] && !used[i]

        要回溯

2) 不可排序,用HashSet记录

        !path.isEmpty() && nums[i]<path.get(path.size()-1) || hs.contains(nums[i])

        不用回溯,因为每层新建

3.元素不重复取(树枝,下一层递归)

  if(used[i]) continue; 

4.continue

本层递归其他数还可往后取  

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

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

相关文章

基于python的k-means聚类分析算法,对文本、数据等进行聚类,有轮廓系数和手肘法检验

K-means算法是一种常见的聚类算法&#xff0c;用于将数据点分成不同的组&#xff08;簇&#xff09;&#xff0c;使同一组内的数据点彼此相似&#xff0c;不同组之间的数据点相对较远。以下是K-means算法的基本工作原理和步骤&#xff1a; 工作原理&#xff1a; 初始化&#x…

Java面试八股之start()和run()的区别

start()和run()的区别 在Java中&#xff0c;run()方法和start()方法是与线程操作紧密相关的&#xff0c;两者之间存在本质的区别&#xff1a; start()是Thread类的一个实例方法&#xff0c;它的主要作用是启动一个新的线程。当调用线程对象的start()方法时&#xff0c;Java虚…

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…

数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式&#xff08;针对format形式&#xff09; ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目&#xff0c;本篇文章我们将学习新的章节&#xff0c;学习字符串及正则表达式。 …

Gradle和Maven项目解决Spring Boot Configuration Annotation Processor not configured警告

问题描述 写了一个配置类,加了注解@ConfigurationProperties(prefix = “xxx”) 后一直报警告:Spring Boot Configuration Annotation Processor not configured 意思是 Spring boot 未配置注解处理器 解决过程 出现这个问题后,百度查了解决方式 1.maven项目 maven项目是…

logback 配置

https://zhuanlan.zhihu.com/p/673142694 配置结构 root 在 Logback 配置文件中&#xff0c; 元素用于配置根 Logger&#xff0c;它是整个日志系统的根节点。根 Logger 拥有最高级别&#xff0c;通常用于设置全局的日志级别和全局的 Appender&#xff08;附加器&#xff09;。…

[Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解

目录 1.不同路径1.题目链接2.算法原理详解3.代码实现 2.不同路径 II1.题目链接2.算法原理详解3.代码实现 3.珠宝的最高价值1.题目链接2.算法原理详解3.代码实现 1.不同路径 1.题目链接 不同路径 2.算法原理详解 思路&#xff1a; 确定状态表示 -> dp[i][j]的含义 走到dp[…

Mac 安装 git

文章目录 前言一、介绍二、下载三、验证四、配置五、Git常用命令六、git提交和撤销工作流程代码提交和提交同步代码撤销和撤销同步 FAQ1.homebrew 下载解决方法一&#xff08;强烈推荐&#xff09;&#xff1a;解决方法二&#xff1a; 总结 前言 Git 是一个开源的分布式版本控…

JavaScript 中的 Range 和 Selection 对象

JavaScript 中的 Range 和 Selection 对象 前言 最近在做鼠标框选的需求&#xff0c;鼠标框选就需要用到 Range 和 Selection 对象。 Range 表示选择的区间范围&#xff0c;Selection 表示选择的文档内容。 下面就详细说下这两个对象 一、Range Range 接口表示一个包含节…

太速科技-FMC125-两路125Msps AD,两路160Msps DA FMC子卡

FMC125-两路125Msps AD&#xff0c;两路160Msps DA FMC子卡 一、板卡概述 板卡可实现2路14bit 125Msps AD 和2路16bit 160MspsDA功能&#xff0c;FMC LPC连接器用于扩展到xilinx用于模拟信号、中频信号采集&#xff0c;信号发出等应用。 二、性能指标 板卡功能 参…

Vue3 Uncaught SyntaxError: Unexpected token <‘ 错误参考解决方法

1.最近在做一个登录首页的动画效果,动画组件是用的网上类似csdn方式,但是本地引入完全没问题,打包正式环境,直接报错,动画直接不起作用. 关于vue2的解决方法: 1.检查引用的 JavaScript 文件是否正确&#xff1a;确认所有引用的外部 JavaScript 文件路径是否正确&#xff0c;可…

陪玩系统源码,高质量的陪玩系统源码,游戏陪玩APP源码开发,语音陪玩源码搭建,整合需求精准定位

如今越来越多的人看到了游戏行业的市场&#xff0c;作为最近几年出现的一个新兴产业&#xff0c;需求是巨大的&#xff0c;因此开发陪玩app源码&#xff0c;正好可以优化服务体验来整合该市场。 原生陪玩源码or混合开发陪玩源码 游戏陪玩APP源码&#xff0c;基本上都是原生的&…

Docker安装MongoDB(Linux版)

文章目录 前言一、Docker环境的准备1.安装依赖2.安装Docker 二、使用Docker安装MongoDB1.mongo版本选取2.拉取合适的镜像3.宿主机创建MongoDB需要挂载的文件夹4.第一次无认证创建mongo用户5.启动需要认证的mongo容器 问题汇总总结 前言 本文章主要介绍在Centos系统&#xff0c…

ROS | 用IMU实现航向锁定

基本原理&#xff1a; 引入速度控制模块&#xff1a; /cmd_vel 设置目标角度&#xff0c;计算偏移差值 然后消息传递在z轴移动的角度 代码实现&#xff1a; C&#xff1a; CPP文件还需要编辑CMAKE文件 Python: Python文件需要给于权限&#xff1a;chmod x imu_node.py

【Muduo】三大核心之Poller、EPollPoller

Poller 在Muduo中&#xff0c;Poller负责基于IO多路复用机制进行IO事件监听和处理的组件&#xff0c;作为EPollPoller的基类&#xff0c;为后者提供了与PollPoller统一的IO复用接口&#xff0c;并且声明了一个关键的创建派生类的成员函数&#xff1a; static Poller *newDefa…

NDIS小端口驱动(五)

在需要的时候&#xff0c;我们也许需要NDIS微型端口程序信息&#xff0c;下面会从多个方面来讨论如何查询NDIS微型端口驱动。 查询无连接微型端口驱动程序 若要查询无连接微型端口驱动程序维护的 OID&#xff0c;绑定协议调用 NdisOidRequest 并传递 一个NDIS_OID_REQUEST 结…

OSPF多区域组网实验(华为)

思科设备参考&#xff1a;OSPF多区域组网实验&#xff08;思科&#xff09; 技术简介 OSPF多区域功能通过划分网络为多个逻辑区域来提高网络的可扩展性和管理性能。每个区域内部运行独立的SPF计算&#xff0c;而区域之间通过区域边界路由器进行路由信息交换。这种划分策略适用…

线性代数(二)

1.标量 标量也叫0D张量&#xff0c;一个标量就是一个数&#xff0c;它只有大小&#xff0c;没有方向。 import torch x torch.Tensor(3) print(x)2.向量 向量也叫1D张量。向量只有一个轴&#xff0c;沿着行的方向&#xff0c;或者沿着列的方向。向量一般指列向量。 import…

光伏储能EMS 风电智慧能量管理系统 -安科瑞王盼盼

安科瑞18721098782王盼盼 一&#xff1a;储能 EMS&#xff08;Energy Management System&#xff09; 储能 EMS&#xff1a;储能 EMS 是一个综合管理系统&#xff0c;用于整体管理和优化储能系统的运行。它基于电力系统的需求和需求响应&#xff0c;通过控制和协调储能设备的…