leetcode 40. Combination Sum II

一 题目

Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.

Each number in candidates may only be used once in the combination.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

Example 1:

Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

Example 2:

Input: candidates = [2,5,2,1,2], target = 5,
A solution set is:
[
  [1,2,2],
  [5]
]

Accepted  249,560  Submissions 574,355

二 分析

  medium级别难度,求数组里面组成target元素的组合。跟上个题目  leetcode 39. Combination Sum 差不多,一个套路,区别在于本题要求不重复。

还是使用DFS 深度优先的递归方法,为了能连续跳过重复的数,这里我们必须先排序。为了不重复元素比如数组里面有3个2,结果里面最多也是3个2,需要额外记录下使用过的索引位置。

public static void main(String[] args) {
		// TODO Auto-generated method stub
       int[] nums = {10,1,2,7,6,1,5};
       List<List<Integer>> res = combinationSum2(nums,8);
       System.out.println(JSON.toJSON( res)) ;
	}

	public static List<List<Integer>> combinationSum2(int[] candidates, int target) {
		
		List<List<Integer>> res = new ArrayList();
		List<Integer> tlist = new ArrayList();
		List<Integer> usedlist = new ArrayList();
		//先排序
		Arrays.sort(candidates);
	     //拆分rule
		combin( candidates,  target,0,tlist,usedlist,res);				
		return res;        

    }
	
	private static void combin(int[] arrays,int target,int index,List<Integer> temp,List<Integer> used,List<List<Integer>> result){
		
		//超范围,不匹配
		if( target<0){
			return;
		}//匹配,加入结果集
		else if(target ==0){
			if(!result.contains(temp)){
				result.add(new ArrayList( temp));
			}
			used = new ArrayList( );
		}else{
			//<target,继续搜索
			for(int i=index;i<arrays.length;i++ ){
				if(arrays[i]>target){
					break;
				}
				//先放入
				if(!used.contains(i)){
				temp.add(arrays[i]);
				used.add(i);
				//尝试匹配
				combin(arrays,target-arrays[i], i, temp,used,result);
				//在取出:最后加入的
				temp.remove(temp.size()-1);
				used.remove(used.size()-1 );
				}
			}			
		}		
	}

Runtime: 6 ms, faster than 51.90% of Java online submissions forCombination Sum II.

Memory Usage: 38.6 MB, less than 83.16% of Java online submissions forCombination Sum II.

时间复杂度 O(N!)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值