剑指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.hqwc.cn/news/588300.html

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

相关文章

托管式 Kubernetes 服务,加速现代化云基础设施升级

降本提效&#xff0c;是创新开发的永恒话题。过去10年中&#xff0c;开发者纷纷拥抱容器技术以提高部署效率&#xff0c;降低运维负担。随着像 Docker 这类容器引擎使用量的不断增长&#xff0c;作为 Docker 管理系统的 Kubernetes&#xff08;简称 K8s&#xff09;顺势而出&am…

【Node.js从基础到高级运用】二十一、使用child_process模块创建子进程

引言 在Node.js中&#xff0c;child_process模块是一个提供了创建和管理子进程的能力的核心模块。通过使用child_process模块&#xff0c;Node.js可以执行系统命令、运行其他脚本或应用程序&#xff0c;实现与Node.js进程的并行处理。 child_process模块提供了几种创建子进程的…

Ant Design Vue中的table与pagination的联合使用

效果&#xff1a; 代码&#xff1a; <a-table:dataSource"dataSource":columns"columns":pagination"pagination"change"handleTableChange":scroll"{ x: 100%, y: 600 }"> </a-table> export default defin…

Lua 和 Love 2d 教程 二十一点朴克牌 (上篇lua源码)

GitCode - 开发者的代码家园 Lua版完整原码 规则 庄家和玩家各发两张牌。庄家的第一张牌对玩家是隐藏的。 玩家可以拿牌&#xff08;即拿另一张牌&#xff09;或 停牌&#xff08;即停止拿牌&#xff09;。 如果玩家手牌的总价值超过 21&#xff0c;那么他们就爆掉了。 面牌…

30道Java经典面试题总结

1、JDK 和 JRE 有什么区别&#xff1f; JDK&#xff08;Java Development Kit&#xff09;&#xff0c;Java 开发工具包 JRE&#xff08;Java Runtime Environment&#xff09;&#xff0c;Java 运行环境 JDK 中包含 JRE&#xff0c;JDK 中有一个名为 jre 的目录&#xff0c…

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…

社交互动:探讨Facebook对用户互动的影响

在当今数字化时代&#xff0c;社交网络已经成为了人们日常生活中不可或缺的一部分。而作为最著名的社交网络平台之一&#xff0c;Facebook不仅连接了全球数十亿用户&#xff0c;还对用户的社交互动产生了深远的影响。本文将深入探讨Facebook对用户互动的影响&#xff0c;以及它…

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现GWO-BiTCN-BiGRU-Attention灰狼算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍程序设计参考…

HarmonyOS入门-ArkTS学习(一)

1. 什么是ArkTS语言 学习之前&#xff0c;我们先初步了解下什么是ArkTS 官方指南这样介绍&#xff1a; ArkTS是TS的超集&#xff0c;ArkTS定义了声明式UI描述、自定义组件和动态扩展UI元素的能力&#xff0c;再配合ArkUI开发框架中的系统组件及其相关的事件方法、属性方法等共…

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…

使用docker-tc对host容器进行限流

docker-tc是一个github开源项目&#xff0c;项目地址是https://github.com/lukaszlach/docker-tc。 运行docker-tc docker run -d \ --name docker-tc \ --network host \ --cap-add NET_ADMIN \ --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /var…

STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式&#xff0c;生成代码四、MDK打开生成项目&#xff0c;编写HAL库的按键检测代码五、运行仿真程序&#xff0c;调试代码 一、功能需求分析 搭建完成开发STM32开发环境之后&#xff0c;开始GPIO…