<leetcode> Combination Sum
来源:互联网 发布:mac的image文件夹在哪 编辑:程序博客网 时间:2024/06/16 05:42
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
- The solution set must not contain duplicate combinations.
For example, given candidate set 2,3,6,7
and target 7
,
A solution set is: [7]
[2, 2, 3]
算法: 同Combinations, DFS+recusion
首先对数组排序(题目要求升序输出)。
然后DFS+recusion进行枚举,题目要求每个元素可以使用多次,所以level指向当前的level而不是下一层,并在recusion中添加参数target,为当前的target-candidates[i](省去list求和过程)。返回条件是target==0,添加当前list到result,或者target<0,当前组合不是solution,返回。
同Combination, 每次recusion传递前需要克隆一个list
public class Solution { public int[] copy; public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> result=new ArrayList<List<Integer>>(); ArrayList<Integer> solution=new ArrayList<Integer>(); if(candidates.length<=0){ return result; } else{ copy=new int[candidates.length]; mergeSort(candidates,0,candidates.length-1); findCombination(candidates,target,0,result,solution); } return result; } public void findCombination(int[] candidates, int target, int level, List<List<Integer>> result, ArrayList<Integer> solution){ if(target==0){ result.add(solution); return; } if(target<0){ return; } for(int i=level;i<candidates.length;i++){ ArrayList<Integer> solutionCopy=(ArrayList)solution.clone();//Clone list solutionCopy.add(candidates[i]); findCombination(candidates,target-candidates[i],i,result,solutionCopy);//level is current i(level) } } /* * Merge sort */ public void mergeArray(int[] numbers,int low,int mid,int high){ int k=low,l=mid+1; for(int i=low;i<=high;i++){ copy[i]=numbers[i]; } for(int j=low;j<=high;j++){ if(k>mid){ numbers[j]=copy[l]; l++; } else if(l>high){ numbers[j]=copy[k]; k++; } else if(copy[k]<copy[l]){ numbers[j]=copy[k]; k++; } else if(copy[k]>=copy[l]){ numbers[j]=copy[l]; l++; } } } public void mergeSort(int[] numbers,int low,int high){ if(high<=low){ return; } int mid=(low+high)/2; mergeSort(numbers,low,mid); mergeSort(numbers,mid+1,high); mergeArray(numbers,low,mid,high); }}
0 0
- [LeetCode] Combination Sum、Combination Sum II
- 【LeetCode】Combination Sum && Combination Sum II
- leetcode之Combination Sum && Combination Sum II
- leetcode Combination Sum &Combination Sum II
- leetcode-combination sum and combination sum II
- Leetcode:Combination Sum与Combination Sum II
- leetcode Combination Sum VS Combination Sum II
- [Leetcode]Combination Sum &&Combination Sum II
- LeetCode Combination Sum & Combination Sum II
- leetcode | Combination Sum & Combination Sum 2
- LeetCode: Combination Sum
- LeetCode: Combination Sum II
- LeetCode: Combination Sum
- LeetCode: Combination Sum II
- [LeetCode]Combination Sum
- [LeetCode]Combination Sum II
- LeetCode Combination Sum
- LeetCode Combination Sum II
- 辛星网站构架师笔记第二篇
- Scramble String
- 二叉树的定义
- <leetcode>Combination
- 第一部分 GeoGeo脚本基础 0. 引言
- <leetcode> Combination Sum
- 第一部分 GeoGeo脚本基础 第1章 变量与数组
- 第一部分 GeoGeo脚本基础 第2章 程序结构
- 5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()
- 第一部分 GeoGeo脚本基础 第3章 字符串表达式
- 3进程状态getrlimit()函数和setrlimit()函数
- Extbase / Fluid: Widget Paginate ViewHelper 处理数组及ObjectStorage
- Leetcode: Reverse Words in a String
- 几种无法调用jacob打印word的解决方法