39. Combination Sum 40. Combination Sum II 216. Combination Sum III
来源:互联网 发布:加强网络舆情监管 编辑:程序博客网 时间:2024/06/05 10:55
模仿dsf算法
使用深度优先的方法搜索,并且用一个list记录向量,找到合适的向量时即将它保存在结果中,并进行回溯操作。对于输入candidates=[1,2] ,target=3,遍历的方向如图
通用算法思路总结:
初始结果列表。
可能要将数集排序,方便处理重复元素的情况。
调用递归函数。
书写递归函数,先要考虑原点状况,一般就是考虑什么情况下要将当前结果添加到结果列表中。
for循环遍历给定集合所有元素,不同题目区别在于进行循环的条件,具体看例子。每当一个元素添加到当前结果中之后,要再调用递归函数,相当于固定了前缀穷举后面的变化。
调用完之后要将当前结果中最后一个元素去掉,进行下一个循环才不会重复。
39. Combination Sum
public List<List<Integer>> combinationSum(int[] nums, int target) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new ArrayList<>(), nums, target, 0); return list; } private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){ if(remain < 0) return; else if(remain == 0) list.add(new ArrayList<>(tempList)); else{ for(int i = start; i < nums.length; i++){ tempList.add(nums[i]); backtrack(list, tempList, nums, remain - nums[i], i); // not i + 1 because we can reuse same elements tempList.remove(tempList.size() - 1); } } }
40. Combination Sum II
1和2的区别
1中无重复,2有重复数字
public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(candidates); findSum(list,new ArrayList<Integer>(),0,candidates,target); return list;}public void findSum(List<List<Integer>> list, List<Integer> lis, int start,int[] nums, int c) { if(c < 0) return; else if(c == 0) list.add(new ArrayList<>(lis)); else { for(int i = start; i < nums.length; i++) { if(i > start && nums[i] == nums[i-1]) continue; // 去除重复 lis.add(nums[i]); findSum(list,lis,i+1,nums,c - nums[i]); lis.remove(lis.size() - 1); } }}
216. Combination Sum III
注意i的变化,是否去重复
public List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> list = new ArrayList<>(); findKSum(list, new ArrayList<Integer>(), k, n, 1); return list; } private void findKSum(List<List<Integer>> list, List<Integer> lis, int k, int sum, int start) { if(sum < 0 || lis.size() > k) return; else if(sum == 0 && lis.size() == k) list.add(new ArrayList<Integer>(lis)); else { for(int i = start; i <= 9; i++) { lis.add(i); findKSum(list,lis,k,sum - i,i+1); lis.remove(lis.size() - 1); } } }
0 0
- [LeetCode]39.Combination Sum&40.Combination Sum II&216.Combination Sum III&377.Combination Sum IV
- LeetCode 39.Combination Sum,40. Combination Sum II,216. Combination Sum III
- 39. Combination Sum 40. Combination Sum II 216. Combination Sum III
- LeetCode 39. Combination Sum && 40. Combination Sum II && 216. Combination Sum III
- leetcode题解-40. Combination Sum II && 216. Combination Sum III
- Combination Sum II&III
- 39. Combination Sum && 40. Combination Sum II
- 39. Combination Sum &&40. Combination Sum II
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- (leetcode)2. 两个链表相加Add Two Numbers--Java
- 连结及索引、优化器相关
- Min Stack
- Mysql学习笔记六——order by 排序
- JavaScript如何动态生成表格
- 39. Combination Sum 40. Combination Sum II 216. Combination Sum III
- Python学习笔记56(爬虫:煎蛋网上的妹子图)
- mybatis框架,细节处理
- 浅谈React.createElement()方法
- 如何实现一个桌面小部件(一)
- 40个Java多线程问题总结
- hive-redis运行Log日志
- pandas.read_csv to_csv参数详解
- bzoj2243 SDOI2011 染色 树链剖分