剑指Offer题目笔记24(集合的组合、排序)

面试题79:

面试题79

问题:

​ 输入一个不含重复数字的数据集合,找出它的所有子集。

解决方案:

​ 使用回溯法。子集就是从一个集合中选出若干元素。如果集合中包含n个元素,那么生成子集可以分为n步,每一步从集合中取出一个数字,此时面临两个选择,将该数字添加到子集中或不将该数字添加到子集中。生成一个子集可以分为若干步,并且每一步都面临若干选择。

源代码:
class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<>();helper(nums,0,new LinkedList<>(),result);return result;}private void helper(int[] nums,int index,LinkedList<Integer> list,List<List<Integer>> result){//扫描完数组后,将链表List<Integer>添加到链表List<List<Integer>>if(index == nums.length){result.add(new LinkedList<>(list));}else{//情况一:不添加该数字helper(nums,index + 1,list,result);//情况二:添加该数字list.add(nums[index]);helper(nums,index + 1,list,result);//删除链表中最后一个元素list.removeLast();}}
}

面试题80:

面试题80

问题:

​ 输入n和k,输出从1到n中选取k个数字组成的所有组合。

解决方案:

​ 使用回溯法。从1到n的集合中选出若干元素。如果组合只能有k个元素,那么生成组合可以分为k步,每一步从集合中取出一个数字,此时面临两个选择,将该数字添加到组合中或不将该数字添加到组合中。生成一个组合可以分为若干步,并且每一步都面临若干选择。

源代码:
class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> result = new LinkedList<>();dfs(n,1,k,new LinkedList<>(),result);return result;}//num用于标记当前数字private void dfs(int n,int num,int k,LinkedList<Integer> list,List<List<Integer>> result){//扫描完数组后,将链表List<Integer>添加到链表List<List<Integer>>if(list.size() == k){result.add(new LinkedList<>(list));}else if(num <= n){//情况一:不添加该数字dfs(n,num+1,k,list,result);//情况二:添加该数字list.add(num);dfs(n,num+1,k,list,result);//删除链表中最后一个元素list.removeLast();}}
}

面试题81:

面试题81

问题:

​ 给定一个没有重复数字的正整数集合,找出所有元素之和等于某个给定值的所有组合。同一个数字可以在组合中出现任意次。

解决方案:

​ 使用回溯法。将问题分为若干步来解决,每一步的面临若干选择。每一步从集合中取出下标为i的数字,此时面临两个选择,一个选择是跳过该数字,不将该数字添加到组合中,另一个选择就是将数字添加到组合中,由于一个数字可以在组合中重复出现,所以下一步仍然处理下标为i的数字,

源代码:
class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> result = new LinkedList<>();dfs(candidates,target,0,new LinkedList<>(),result);return result;}private void dfs(int[] candidates,int target,int i,LinkedList<Integer> list,List<List<Integer>> result){if(target == 0){result.add(new LinkedList<>(list));}else if(target > 0 && i < candidates.length){//情况一:跳过该数字dfs(candidates,target,i+1,list,result);//情况二:添加该数字list.add(candidates[i]);dfs(candidates,target-candidates[i],i,list,result);list.removeLast();}}
}

面试题82:

面试题82

问题:

​ 给定一个可能包含重复数字的整数集合,请找出所有元素之和等于某个给定值的所有组合。

解决方案:

​ 使用回溯法。该题与前几题类似,但是组合可以有重复数字,但是组合不能相同,避免重复的组合的方法是当在某一步决定跳过某个值为m的数字时,跳过所有值为m的数字。为了方便跳过后面所有值相同的数字,先将集合中的所有数字排序,再进行跳跃。

源代码:
class Solution {public List<List<Integer>> combinationSum2(int[] candidates, int target) {//排序数组Arrays.sort(candidates);List<List<Integer>> result = new LinkedList<>();dfs(candidates,target,0,new LinkedList<>(),result);return result;}private void dfs(int[] candidates,int target,int i,LinkedList<Integer> list,List<List<Integer>> result){if(target == 0){result.add(new LinkedList<>(list));}else if(target > 0 && i < candidates.length){dfs(candidates,target,getNext(candidates,i),list,result);list.addLast(candidates[i]);dfs(candidates,target-candidates[i],i+1,list,result);list.removeLast();}}//跳过数组中值等于num的下标private int getNext(int[] candidates,int num){int next = num;while(next < candidates.length && candidates[num] == candidates[next]){next++;}return next;}
}

面试题83:

面试题83

问题:

​ 给定一个没有重复数字的集合,找出它的所有全排序。

解决方案;

​ 使用回溯法。如果输入的集合中有n个元素,那么生成一个全排列需要n步。当生成排列的第1个数字时会面临n个选项,即n个数字都有可能成为排列的第1个数字。生成排列的第1个数字之后接下来生成第2个数字,此时面临n-1个选项,即剩下的n-1个数字都有可能成为第2个数字。然后以此类推,直到生成最后一个数字,此时只剩下1个数字,也就只有1个选项。

源代码:
class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> result = new LinkedList<>();dfs(nums,0,result);return result;}private void dfs(int[] nums,int i,List<List<Integer>> result){//如果i等于nums.length,说明数组nums已经按顺序排序完成。if(i == nums.length){LinkedList<Integer> list = new LinkedList<>();for(int num:nums){list.add(num);}result.add(new LinkedList<>(list));}else{//排序每一个数,如数组中的所有元素都可以成为下标0的位置,包括它自己for(int j = i;j < nums.length;j++){swap(nums,i,j);dfs(nums,i+1,result);swap(nums,i,j);}}}//交换两数字在数组的位置private void swap(int[] nums,int i,int j){if(i != j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}

面试题84:

面试题84

问题:

​ 给定一个包含重复数字的集合,找出它的所有全排列。

解决方案:

​ 使用回溯法。与上一题类似,但是添加了包含重复数字的条件,在上一题的基础上使用Set集合排序重复数字。

源代码:
class Solution {public List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> result = new LinkedList<>();dfs(nums,0,result);return result;}private void dfs(int[] nums,int i,List<List<Integer>> result){//如果i等于nums.length,说明数组nums已经按顺序排序完成。if(i == nums.length){LinkedList<Integer> list = new LinkedList<>();for(int num:nums){list.add(num);}result.add(new LinkedList<>(list));}else{//使用Set集合排除重复数字Set<Integer> set = new HashSet<>();for(int j = i;j < nums.length;j++){if(!set.contains(nums[j])){set.add(nums[j]);swap(nums,i,j);dfs(nums,i+1,result);swap(nums,i,j);}}}}private void swap(int[] nums,int i,int j){if(i != j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}}
}

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

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

相关文章

Python控制浏览器——selenium模块

Python控制浏览器——selenium模块 目录 Python控制浏览器——selenium模块准备工作【1】安装selenium【2】安装浏览器驱动【3】测试驱动&#xff08;作者是Edge&#xff09; 导航和操作窗口导航返回前进刷新最大化窗口切换选项卡 查找和操作元素8种基本By定位方式[1]ID[2]Name…

ndk ffmpeg

报错&#xff1a; 解决办法&#xff1a; 报错 解决办法&#xff1a;

纯CSS实现未读消息显示99+

在大佬那看到这个小技巧&#xff0c;我觉得这个功能点还挺常用&#xff0c;所以给大家分享下具体的实现。当未读消息数小于100的时候显示准确数值&#xff0c;大于99的时候显示99。 1. 实现效果 2. 组件封装 <template><span class"col"><sup :styl…

【代码】C语言|保留小数点后n位并四舍五入,便于处理运算和存储不善的浮点数

前言 有个人跟我说浮点数运算起来非常麻烦&#xff0c;总是算着算着丢失精度&#xff0c;导致计算结果取int的时候取不准。毕竟系统也没有自动根据这个数的精度四舍五入的功能。 比如int(2.999999999999999)2&#xff0c;但是float(2.999999999999999)3.000000。 我觉得这个问…

关于51单片机TMOD定时器的安全配置

定时器介绍&#xff1a; -------------------------------------------------------------------------------------------------------------------------- 首先配置的是控制寄存器 TCON 说直白点&#xff0c;这个寄存器就是用来计数的&#xff0c;打开计时器&#xff0c;关…

Python-VBA编程500例-029(入门级)

连续字符段索引(Index of Consecutive Character Segments)在实际应用中具有多种场景。常见的应用场景有&#xff1a; 1、文本分析&#xff1a;在文本处理和分析中&#xff0c;连续字符段索引可以用于识别重复的字符序列或模式。这些模式可能对于理解文本的结构、风格或特定含…

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 &#xff08;一&#xff09;随机变量 &#xff08;二&#xff09;全概率公式 &#xff08;三&#xff09;高斯分布及其性质 二、似然是什么&#xff1f; &#xff08;一&#xff09;概率和似然 &#xff08;二&#xff09;极大似然估计 …

Pycharm显示Low memory的解决办法

这种情况该怎么办呢&#xff1f; 按照网上的说法&#xff0c;首先按照下图&#xff0c;选择memory Indicator: 就可以在pycharm的右下角看到内存以及其分配情况&#xff08;allocated表示被分配的&#xff0c;可以看到我的已经被分配完了&#xff0c;应该是这个意思&#xff0…

Matlab|计及需求侧响应日前—日内两阶段鲁棒备用优化

目录 1 主要内容 日前计划模型 日内调整模型 不确定集建模 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《计及需求侧响应日前—日内两阶段鲁棒备用优化》&#xff0c;以6节点系统为例&#xff0c;综合考虑风电出力不确定性与电力设备 N-k强迫停运&…

NASA数据集——包括阿拉斯加的 39 个站点和加拿大西北部的 12 个站点)的季节性沉降、活动层厚度 (ALT)、垂直土壤水分剖面数据

ABoVE: Active Layer Thickness from Airborne L- and P- band SAR, Alaska, 2017, Ver. 3 简介 文件修订日期&#xff1a;2022-09-15 数据集版本: 3 摘要 本数据集以 30 米的分辨率提供了整个 ABoVE 域 51 个站点&#xff08;包括阿拉斯加的 39 个站点和加拿大西北部的 1…

救砖刷机------MTK芯片类线刷 救砖 常规线刷不开机 MTK分区表修复【二】

救砖刷机------MTK芯片类线刷 救砖 免授权的一些操作步骤与工具解析【一】 在上期的博文中解析了mtk刷机平台的一些基本选项说明和授权刷写的一些常识。这期将着重说明下mtk机型分区表损坏如何解决。 众所周知。高通分区表在高通线刷包中显而易见,在常规9008刷写中你会正常刷…

什么是Redis共享Session?

如图所示&#xff0c;一个分布式部署的Web服务器将用户的Session信息&#xff08;例如用户登录信息&#xff09;&#xff0c;保存在各自服务器内部。这样会造成一个问题&#xff0c;在分布式部署多个Web服务器时&#xff0c;我们通常会采用负载均衡算法&#xff0c;将多个用户的…

概率论基础——拉格朗日乘数法

概率论基础——拉格朗日乘数法 概率论是机器学习和优化领域的重要基础之一&#xff0c;而拉格朗日乘数法与KKT条件是解决优化问题中约束条件的重要工具。本文将简单介绍拉格朗日乘数法的基本概念、应用以及如何用Python实现算法。 1. 基本概念 拉格朗日乘数法是一种用来求解…

从数据孤岛到信息共享,应用集成网关打造业务新生态

想象一下&#xff0c;你坐在剧院里&#xff0c;期待着享受一场精彩的音乐剧表演。但当灯光渐暗&#xff0c;音乐开始奏响时&#xff0c;你却发现演出陷入了混乱之中&#xff1a;没有人站在正确的位置&#xff0c;每个人都在互相交谈或保持沉默&#xff0c;管弦乐队的演奏时机也…

绿色wordpress外贸建站模板

绿色wordpress外贸建站模板 https://www.mymoban.com/wordpress/6.html

Android 窗口那些事儿

目录 1. &#x1f4c2; 前言 你&#xff0c;是否有过这些疑问&#xff1f; 2. &#x1f531; Window 2.1 认识 Window 的几个阶段 1&#xff09;阶段一&#xff1a;Window 约等于 Activity 2&#xff09;阶段二&#xff1a;Window 约等于 View 3&#xff09;阶段三&…

基于深度学习的危险物品检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文详细介绍基于YOLOv8/v7/v6/v5的危险物品检测技术。主要采用YOLOv8技术并整合了YOLOv7、YOLOv6、YOLOv5的算法&#xff0c;进行了细致的性能指标对比分析。博客详细介绍了国内外在危险物品检测方面的研究现状、数据集处理方法、算法原理、模型构建与训练代码…

保健品wordpress外贸模板

保健品wordpress外贸模板 健康保养保健品wordpress外贸模板&#xff0c;做大健康行业的企业官方网站模板。 https://www.jianzhanpress.com/?p3514

蓝桥杯刷题第八天(dp专题)

这道题有点像小学奥数题&#xff0c;解题的关键主要是&#xff1a; 有2种走法固走到第i级阶梯&#xff0c;可以通过计算走到第i-1级和第i-2级的走法和&#xff0c;可以初始化走到第1级楼梯和走到第2级楼梯。分别为f[1]1;f[2]1(11)1(2)2.然后就可以循环遍历到后面的状态。 f[i…

XenCenter 2024 创建一个虚拟机

前言 实现&#xff0c;创建一个虚拟机&#xff0c;内存&#xff0c;cpu&#xff0c;磁盘&#xff0c;名称&#xff0c;网卡&#xff0c;配置 Xen Center 2024 download 创建虚拟机 选择系统类型 定义虚拟机名称 选择ISO镜像库 选择主服务器 分配虚拟机内存&#xff0c;cpu资源…