leetcode之回溯backtracing专题1

39 Combination Sum

 给一组整数,给一个目标整数。从数组中任意选择几个数,这几个数的和等于目标整数。数组中每个数字可以选择多次。
 例如given candidate set [2, 3, 6, 7] and target 7, 返回
[
[7],
[2, 2, 3]
]

 思路:数组candidates 中每个数字可以选择一次或者多次。每次在递归中可以选择或者不选择这个数。
 首先从0下标开始,每次递归,做个选择。选中当前元素的话:nums[idx]++,表示选择了一个candidates[idx],同时目标值要减小。如果不选择当前元素的话,下标加1,向下遍历。
 以下代码可以给进的地方是:可以算出最多可以有多少个candidates[idx],避免不必要的递归。
 递归的退出条件要先写好。

public class CombinationSum39 {private List<List<Integer>> resultList = new ArrayList<List<Integer>>();private int[] nums = null;public List<List<Integer>> combinationSum(int[] candidates, int target) {resultList.clear();nums = new int[candidates.length];visit(candidates, target, 0);return resultList;}private void visit(int[] candidates, int target, int idx) {if (target == 0) {List<Integer> result = new ArrayList<Integer>();for (int i = 0; i < nums.length; i++) {for (int j = 0; j < nums[i]; j++) {result.add(candidates[i]);}}resultList.add(result);return;}if (target < 0 || idx >= candidates.length) {return;}int maxCount = target/candidates[idx];for(int i=0;i<maxCount;i++){nums[idx] = i;visit(candidates, target - i*candidates[idx], idx);nums[idx] = 0;}}public static void main(String[] args) {List<List<Integer>> list = new CombinationSum39().combinationSum(new int[]{2,3,6,7}, 7);System.out.println(list);}
}

40 Combination Sum II

 在39题目的基础上增加了限制条件:数组中每个数只能使用一次。但是数组中有重复的数字。
 思路:首先把无限次使用变成只能使用一次。但是这样可能会出现重复的解。解决方法是先排序。

数组 1 1 2 5
选中 0 0 1 1
   0 1 1 1
   1 0 1 1
   1 1 1 1
 当遇到前两位是01和10的时候解就会是重复的。这个时候可以选择 01 是有效的或者 10 是有效的。 因为问题可能在第一个1的时候就解决了,所以形成 10 这样的串是很自然的。再者,判断第一位是否已经达到目的,不需要考虑后面的因素。所以最好的选择是选择 01 是无效的。这里非常重要。
还有一个地方是,因为数组中每个元素只能取一次,所以可以选择用boolean数组来标记,不再用数组num做标记。

public class Solution {private List<List<Integer>> resultList = new ArrayList<List<Integer>>();private int[] nums=null;public List<List<Integer>> combinationSum2(int[] candidates, int target) {resultList.clear();Arrays.sort(candidates);nums = new int[candidates.length];visit(candidates,target,0);return resultList;}private void visit(int[] candidates, int target,int idx){if(target==0){List<Integer> result = new ArrayList<Integer>();for(int i=0;i<nums.length;i++){if(nums[i]>0){result.add(candidates[i]);}}resultList.add(result);return;}if(target<0 || idx>=candidates.length){return;}if(idx>0 && candidates[idx]==candidates[idx-1] && nums[idx-1]==0 ){//不选择当前数据nums[idx]=0;visit(candidates,target,idx+1);}else{//选择当前数据nums[idx]++;visit(candidates,target-candidates[idx],idx+1);//不选择当前数据nums[idx]--;visit(candidates,target,idx+1);}}
}

216 Combination Sum III

 从1-9中找到k个数,这k个数的和是target。输出这k个数的组合,组合不能重复。
例如 输入k=3,target=7,则输出 [[1,2,4]]
 思路:题中没有明确说明,但从例子来看,每个数字只能使用一次。这和40题类似。一个数组长度为10,里面存的是boolean类型。path[i]=true,表示i被选中。
数组下标 0 1 2 3 4 5 6 7 8 9
值   f t t t f f f f f f =1+2+3

public class Solution {private boolean[] path;private List<List<Integer>> resultList = new ArrayList<List<Integer>>();public List<List<Integer>> combinationSum3(int k, int n) {path = new boolean[10];resultList.clear();robot(1,k,n);return resultList;}private void robot(int idx,int k,int n){if(n==0 && k==0){List<Integer> result = new ArrayList<Integer>();for(int i=0;i<path.length;i++){if(path[i]){result.add(i);}}resultList.add(result);}if(n>0 && idx<path.length && idx<=n && k>0){path[idx]=true;robot(idx+1,k-1,n-idx);path[idx]=false;robot(idx+1,k,n);}}
}

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

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

相关文章

第十九期:HTTPS虐我千百遍,我却待她如初恋!

本篇将讨论 HTTPS 的加解密原理&#xff0c;很多人都知道 RSA&#xff0c;以为 HTTPSRSA&#xff0c;使用 RSA 加解密数据&#xff0c;实际上这是不对的。 图片来自 Pexels HTTPS 是使用 RSA 进行身份验证和交换密钥&#xff0c;然后再使用交换的密钥进行加解密数据。 身份验…

[Leetcode][第546题][JAVA][移除盒子][递归][动态规划]

【问题描述】[困难] 【解答思路】 1. 递归 动态规划 class Solution {public int removeBoxes(int[] boxes) {int[][][] dp new int[100][100][100];return calculatePoints(boxes, dp, 0, boxes.length - 1, 0);}public int calculatePoints(int[] boxes, int[][][] dp, int…

leetcode之回溯backtracing专题2

46 Permutations 输入一个不重复的数组 &#xff0c;写出这个数组的排列&#xff0c;不能重复。  例如 输入nums[1,2,3]&#xff0c;输出 [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路&#xff1a;可以看到 第0位&#xff08;从左开始数&#xff…

第二十期:核心交换机的链路聚合、冗余、堆叠、热备份

链路聚合是将两个或更多数据信道结合成一个单个的信道&#xff0c;该信道以一个单个的更高带宽的逻辑链路出现。 一、链路聚合 链路聚合是将两个或更多数据信道结合成一个单个的信道&#xff0c;该信道以一个单个的更高带宽的逻辑链路出现。 链路聚合一般用来连接一个或多个带…

[Leetcode][第20题][JAVA][有效的括号][栈][HashMap]

【问题描述】[中等] 【解答思路】 1. 栈 如果是一个合法的括号序列&#xff0c;遍历到一个右括号(i)时&#xff0c;那么它的前一个括号(i-1)必定是它的另一半(左括号)。反之不是它的另一半或者前面没有括号时&#xff0c;那这个序列必定是非法括号序列。 思路&#xff1a;利用…

Unity3D 物体移动方法总结

1. 简介 在Unity3D中&#xff0c;有多种方式可以改变物体的坐标&#xff0c;实现移动的目的&#xff0c;其本质是每帧修改物体的position。 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态&#xff0c;它包括 位置(position)&#xff0c; 旋转(rotati…

leetcode之回溯backtracing专题3

17 Letter Combinations of a Phone Number 手机上每个数字按钮旁边都有3-4个字母&#xff0c;输入数字字符串&#xff0c;输出可能的字母组合。  例如输入&#xff1a;”23”  输出&#xff1a;[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]…

第二十一期:拜托!面试不要再问我Spring Cloud底层原理

毫无疑问&#xff0c;Spring Cloud 是目前微服务架构领域的翘楚&#xff0c;无数的书籍博客都在讲解这个技术。 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面&#xff0c;其底层的很多原理&#xff0c;很多人可能并不知晓。 因此本文将通过大量的手绘图&#xff0c…

springBoot修改代码不需要重启-热部署

springboot每次修改代码都需要重启项目&#xff0c;进行热部署后就不需要每次修改代码都要重启项目了 热部署&#xff1a; 需要在pom.xml里进行配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools&…

[Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]

【问题描述】[中等] 【解答思路】 其实就是深拷贝的一个实现&#xff0c;深拷贝就是对于所有的指针成员&#xff0c;不能仅仅是赋值&#xff0c;还有重新分配空间。 深拷贝反应在本题中就是&#xff0c;所有的结点需要重新new出来&#xff0c;而不是直接赋值。 整体的思路依然…

阅读目录(置顶)(长期科技领域知识)

第一期:适用于数据项目的7种强大的开源工具 第二期:四种正确的微服务部署方式 第三期:开源和赚钱何去何从 第四期:Web前端和Java开发哪个薪资更高&#xff0c;发展前景更好&#xff1f; 第五期:干货总结&#xff1a;中级前端工程师必须要掌握的27个JavaScript 技巧 第六期…

leetcode之回溯backtracing专题4

131 Palindrome Partitioning 输入一个字符串s&#xff0c;将s分割为n个子串&#xff0c;每个子串都是一个回文。返回s有多少种分割方式。  例如输入&#xff1a;“aab”  输出&#xff1a;[ [“aa”,”b”], [“a”,”a”,”b”] ]  思路&#xff1a;这是一个不断将问…

[Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

【问题描述】[简单] 【解答思路】 千万不要想复杂了 不是三维空间 是一维空间 &#xff01; 本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是&#xff1a;直接或间接相邻的同色方格构成的整体。 可以发现&#xff0c;「色块」就是被不同颜色的方…

第六章 参数估计(续)

区间估计 问题&#xff1a;点估计估计的参数有多大概率是正确的&#xff1f;用区间估计来表示。 置信区间 设总体X的分布函数F(x;θ)&#xff0c;θ未知&#xff0c;对给定值α(0<α<1)&#xff0c;有两个统计量θ^Lθ^L(X1,X2,...Xn),θ^Uθ^U(X1,X2,...Xn)&#xff0c…

第六十八期:程序员与医生

8月25日 以下文章来源于崖边小生 &#xff0c;作者道友留步 程序员与医生 久病未能成医&#xff0c;然而却悟出了程序员与医生的道理。细想来&#xff0c;程序员和医生这个职业竟如此相似。 职业的诞生 上帝创造了人类&#xff0c;而人类又创造了程序。上帝所创造的人类并…

【数据结构与算法】计数、基数、桶 O(n) 不基于比较

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 桶排序–>分区间桶快速排序&#xff08;归并排序&#xff08;稳定性&#xff09;&#xff09;–>取出结果 计数排序&#xff08;特殊的桶排序&#xff09;–>分单个桶…

java核心-多线程-Java多线程编程涉及到包、类

Java有关多线程编程设计的类主要涉及两个包java.lang和java.util.concurrent两个包 java.lang包&#xff0c;主要是线程基础类 <1>Thread<2>Runnable<3>ThreadLocal java.util包&#xff0c;主要是线程基础类和并发工具类 <1>基础线程类Callable、Futu…

第六十九期:【学习分享】温水里的程序员,技术将成为温水

张泰峰 7月7日 七月&#xff0c;炎炎的夏日&#xff0c;疯狂的暴雨不分昼夜&#xff0c;侵袭着这座城。早上七点&#xff0c;我骑着摩拜单车出发去往地铁站&#xff0c;誓死如归一般的&#xff0c;挤进地铁。像往常一样&#xff0c;骑车、挤地铁、打卡上班。 相信大家都跟我一…

第七章 假设检验

假设检验的目的是通过收集到的数据&#xff0c;来验证某个想要得到的结论。 假设检验的思想是&#xff1a;小概率反证法思想。 显著性检验是本章的主要内容。下面从实际例子来通俗的理解一下显著性检验。 显著性检验中有几个概念不太好理解。 嫌犯X是否有罪 有这样一个事件…

第七十期:IT技术人员的自我修养

8月4日 以下文章来源于空山新雨的技术空间 &#xff0c;作者空山新雨的技术空间 前言 在IT领域摸爬滚打多年&#xff0c;从一个普通程序员到技术主管&#xff0c;到技术经理&#xff0c;再到技术总监&#xff0c;踩过不少坑、加过不少班&#xff0c;也背过不少锅。 在提升自…