刷题日记07《回溯算法》

news2025/1/10 1:57:51

题目描述

力扣https://leetcode.cn/problems/VvJkup/

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

示例 1:

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

输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:

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

 

提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

解题思路

与排列不同的是,组合不需要保持元素间的相对位置保持不变(元素位置调换是一种新的组合),因此对于每一层的递归中,都需要从头开始选择元素加入备选数据中,但是data中可能存在重复元素,因此我们需要使用一个choose数组来判断该元素是否已经被选择, 同时使用下标index作为递归结束的指标

实例代码

class Solution {
    //存放元素的队列
     private List<List<Integer>>res=new LinkedList<>();
    private LinkedList<Integer>data=new LinkedList<>();
    //存放元素是否选择的数组
    boolean isChoose[];
    public List<List<Integer>> permute(int[] nums) {
        //初始化选择数组
        isChoose=new boolean[nums.length];
        reverse(nums,0);
        return res;
    }
    //递归函数
    public void reverse(int[]nums,int index){
        //递归出口
        if(index==nums.length){
            res.add(new LinkedList(data));
        }
        //遍历添加
        for(int i=0;i<nums.length;++i){
            if(isChoose[i]){
                continue;
            }
            data.add(nums[i]);
            isChoose[i]=true;
            //递归
            reverse(nums,index+1);
            //回溯
            isChoose[i]=false;
            data.removeLast();
        }
    }
}

题目描述

力扣https://leetcode.cn/problems/7p8L0Z/

给定一个可包含重复数字的整数集合 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]]

 

提示:

1 <= nums.length <= 8
-10 <= nums[i] <= 10

解题思路

与上题有所不同的是,num数组中存在重复的元素,但是重复的元素在进行组合过程中会产生重复结果,因此我们需要进行剪枝处理,我们的剪枝策略如下:如果nums[i]==nums[i-1]相等,并且当前data中没有选择nums[i-1]但是选择了nums[i],将这种情况进行去除(因为前面没选择但是后面选择了说明前面元素已经选择过了),同样需要一个index,当index指向最后元素时,递归结束

实例代码

class Solution {
     //在求无相同元素的基础上加之排序将问题解决
        //存放元素的队列
     private List<List<Integer>>res=new LinkedList<>();
    private LinkedList<Integer>data=new LinkedList<>();
    //存放元素是否选择的数组
    boolean isChoose[];
    public List<List<Integer>> permuteUnique(int[] nums) {
       isChoose=new boolean[nums.length];
       //排序
       Arrays.sort(nums);
       reverse(nums,0);
       return res;
    }
    //递归函数
    public void reverse(int[]nums,int index){
        //递归出口
        if(index==nums.length){
            //加入结果
            res.add(new LinkedList(data));
        }
        //循环加入、
        for(int i=0;i<nums.length;++i){
            if(isChoose[i]){
                //剪枝1
                continue;
            }
            if(i>0&&nums[i]==nums[i-1]&&!isChoose[i-1]){
                //剪枝2
                continue;
            }
            //结果加入数据
            data.add(nums[i]);
            isChoose[i]=true;
            //递归
            reverse(nums,index+1);
            //回溯
            isChoose[i]=false;
            data.removeLast();
        }
    }
}

题目描述

力扣icon-default.png?t=N658https://leetcode.cn/problems/M99OJA/

正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:

输入:n = 1
输出:["()"]

 

提示:

1 <= n <= 8

解题思路

本题为括号问题,面对这种题目,如果递归随意组合会产生很多错误的结果,所以必须对其进行合适的剪枝,而剪枝策略也比较简单,当左括号的个数小于右括号或者当左括号或者右括号的个数大于n的时候,直接进行剪枝即可,将最后符合要求的结果放入结果集即可

实例代码

class Solution {
    private List<String>res=new LinkedList<>();
    private char[] data=null;
    public List<String> generateParenthesis(int n) {
        data=new char[2*n];
        reverse(n,0,0);
        return res;
    }
    //递归函数
    public void reverse(int n,int leftCount,int rightCount){
     if(leftCount>n||rightCount>n||leftCount<rightCount){
         return;
     }
        if(leftCount==n&&rightCount==n){
            res.add(new String(data));
            return;
        }
        //处理
        data[leftCount+rightCount]='(';
        reverse(n,leftCount+1,rightCount);
        data[leftCount+rightCount]=')';
        reverse(n,leftCount,rightCount+1);
    }

题目描述

力扣icon-default.png?t=N658https://leetcode.cn/problems/palindromic-substrings/

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:

输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

 

提示:

1 <= s.length <= 1000
s 由小写英文字母组成

解题思路

使用动态规划对此题进行求解,创建二维数组dp[i][j],其含义为从i到j该字符串是否为回文串,而判断回文子串的规则为:如果j-i<=1且char[i]==char[j] ,表示两个字符为一个字符或者两个字符串相连,此时两者为组成的字符串为回文子串,如果j-i>1且char[i]==char[j],若dp[i+1][j-1]=true,则说明从i到j组成的字符串为回文串,初始化,因为没有验证是否为回文串,每个字符串刚开始全部为false,遍历顺序-> dp[i][j]=dp[i+1][j-1],所以遍历顺序为从下到上,从左向右进行遍历

实例代码

class Solution {
    public int countSubstrings(String s) {
        int res=0;
         //直接使用动态规划进行求解
        int n=s.length();
        boolean dp[][]=new boolean[n][n];
        //将s转化为数组
        char[]ch=s.toCharArray();
        for(int i=n-1;i>=0;--i){
            for(int j=i;j<n;++j){
                if(ch[i]==ch[j]){
                    if(j-i<=1){
                        dp[i][j]=true;
                        res++;
                    }else{
                        if(dp[i+1][j-1]==true){
                            dp[i][j]=true;
                            res++;
                        }
                    }
                }
            }

        }
        return res;
    }
}

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

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

相关文章

STM32 Proteus仿真ILI9341显示电桥电子秤重量测量差分放大电路 -0062

STM32 Proteus仿真ILI9341显示电桥电子秤重量测量差分放大电路 -0062 Proteus仿真小实验&#xff1a; STM32 Proteus仿真ILI9341显示电桥电子秤重量测量差分放大电路 -0062 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 ILI9341TFT显示器4个电位器组成的电桥电…

好用的文献阅读插件(Easy Scholar、EasyPubMedicine、Sci-Hub X Now!)

目录 一、Easy Scholar 二、EasyPubMedicine 一、Easy Scholar Easy Scholar&#xff1a;自动显示期刊等级&#xff0c;帮助筛选优质论文。 安装&#xff1a; 点击浏览器右上角的“。。。”&#xff0c;选择“扩展”。 点击打开加载项 在浏览器的扩展商店中搜索“easy sch…

MyBatis 中如何使用缓存

MyBatis 中如何使用缓存 MyBatis 是一个基于 Java 的持久层框架&#xff0c;它提供了多种方式来使用缓存&#xff0c;包括一级缓存和二级缓存。本文将介绍 MyBatis 中常见的缓存使用方式及其使用方法。 1. 一级缓存 MyBatis 中的一级缓存是指 SqlSession 的缓存&#xff0c;它…

Android 圆环统计图(带外延折线可点击)

需求先看UI效果图吧 看到这肯定去找轮子&#xff0c;找了半天&#xff0c;没找到相似的&#xff0c;大部分搜到的都是点击外凸&#xff0c;而这个UI是内凸&#xff0c;其实外凸内凸区别还不小&#xff0c;没找到一样的&#xff0c;于是乎&#xff0c;和iOS说好了要不就放弃吧&…

途乐证券-充电性能最高提升3.8倍,固态电池有新突破!

固态电池当时处于起步阶段&#xff0c;工业化仍需时刻。组织预计2030年商场空间有望达200亿元。 固态电池技能继续取得突破发展 过去10年&#xff0c;液态锂离子电池的能量密度现已提高了2倍~3倍&#xff0c;现在现已挨近理论上限。而全固态电池运用固体电解质替代了传统锂离子…

科技资讯|苹果Vision Pro预计2024年末全球发售

据彭博社记者古尔曼消息&#xff0c;苹果首款头显Vision Pro计划于2024年初在美国市场指定店铺进行开售&#xff0c;这些商店将会有专属区域用于产品演示&#xff0c;配备座位、配件和测量尺寸的工具等。知情人士透露&#xff0c;将有270家美国的苹果商店会销售Vision Pro&…

简述MySQL体系结构以及安装部署MySQL

目录 一、简述MySQL体系结构 1、连接层&#xff1a; 2、SQL层&#xff1a; 3、存储引擎层&#xff1a; 4、物理文件层&#xff1a; 5、一条SQL语句执行过程&#xff1a; 二、安装部署MySQL&#xff08;使用yum以及通用二进制方式&#xff09; 1、前期准备 1.1、关闭防火…

金九银十Java八股文面试题整理(含阿里、腾迅大厂java面试真题)

前言 看到了许多朋友在焦急的准备“金九银十”跳槽面试&#xff0c;甚至很多即将毕业的大学生都在备战秋招&#xff0c;对于学历还算优秀的大学生来说&#xff0c;这是一次离大厂最近的机会&#xff0c;毕竟是应届毕业生&#xff0c;不会对技术有非常严格的要求。 而对于工作…

注解开发配置实例

对比一下xm的配置&#xff1a; 新&#xff1a;注解开发&#xff0c;现在任何框架都有两套配置&#xff0c;一套xml配置&#xff0c;一套注解配置 现在我想把user Dao 和user serve 放到spring 中进行配置 service业务层 看到reipaositerei,就是我们Dao 层 用他来标注初始化方…

WORD模板替换,将文件给前端下载

1.word模板设计填充字段加{{填充字段名}} 2.后端依赖 <poi-tl.version>1.7.3</poi-tl.version> <poi.version>4.1.2</poi.version> <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId>&l…

基于Mediapipe深度学习算法的手势识别系统【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目

功能演示 摘要&#xff1a;手势识别是一种通过技术手段识别视频图像中人物手势的技术。本文详细介绍了手势识别实现的技术原理&#xff0c;同时基于python与pyqt开发了一款带UI界面的手势识别系统软件&#xff0c;以便于进行结果显示。手势识别采用了mediapipe的深度学习算法进…

[MMDetection]绘制PR图

评价指标 平均精度与平均召回率 AP 是所有类别的平均值。传统上&#xff0c;这称为“平均精度”(mAP)。我们不区分 AP 和 mAP&#xff08;同样&#xff0c;AR 和 mAR&#xff09; APAP at IoU.50:.05:.95 (primary challenge metric)AP50AP at IoU.50 (PASCAL VOC metric)AP…

数据结构初阶--绪论

目录 一.什么是数据结构 二.什么是算法 三.算法的时间复杂度 四.算法的空间复杂度 五.复杂度练习 题一&#xff1a;消失的数字 题二&#xff1a;旋转数组 一.什么是数据结构 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的三要素…

【LittleXi】 N-gram模型(C++实现)

LittleXi N-gram模型&#xff08;C实现&#xff09;马尔科夫性 (独立性假设)代码实现英文训练版本中文训练版本 训练效果 N-gram模型&#xff08;C实现&#xff09; 定义&#xff1a;通俗地讲&#xff0c;就是利用前文的单词&#xff0c;来推算下一个最大概率出现的单词 马尔…

Web入门-Web服务器

Web服务器是一个程序软件&#xff0c;对HTTP协议的操作进行封装&#xff0c;使得程序员不必直接对程序进行操作&#xff0c;让Web开发更加便捷&#xff0c;简化web程序开发。主要功能是“通过网上信息浏览服务”。 Tomcat 概念&#xff1a;Tomcat是阿Apache软件基金会一个核心…

Coggle 30 Days of ML(23年7月)任务八:训练BILSTM模型

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务八&#xff1a;训练BILSTM模型 任务八&#xff1a;使用Word2Vec词向量&#xff0c;搭建BILSTM模型进行训练和预测 说明&#xff1a;在这个任务中&#xff0c;你将使用Word2Vec词向量&#xff0c;搭建BILSTM模型进行文…

【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

从零开始制作一个Web蜜罐扫描器(2)

从零开始制作一个Web蜜罐扫描器(0)_luozhonghua2000的博客-CSDN博客 从零开始制作一个Web蜜罐扫描器(1)_luozhonghua2000的博客-CSDN博客 文件读取和写入实现 上面的工作已经完成了逻辑判断的部分,下面还需要进一步完善一些旁支末节的部分因为爬虫生成的文件是一个ison文件…

熵权法 —— matlab

目录 一、熵权法介绍 二、熵权法赋权步骤 1.指标正向化 mapminmax介绍 2.数据标准化 3.计算信息熵 4.计算权重以及得分 三、实例分析 1.读取数据 2.指标正向化 2.1 越小越优型处理 2.2 某点最优型指标处理 3.数据标准化 4.计算信息熵 5.计算权重 6.计算得分 总…

第三章 技术选型

1、需要考虑以下几点 可控性 必须有人可以兜底&#xff0c;可以解决 稳定性 修改的版本最好可以上下兼容 核心项目不要用最新的技术 commit的时长 是否有团队维护 适用性 更多人都会的技术 易用性 学习曲线 2、有哪些好用的移动端React组件库 3、为什么使用NestJS 1、最像…