IncredibleThings

导航

LeetCode-Combination Sum II

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

Each number in C 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.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8, 
A solution set is: 
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]
public class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        if(candidates==null || candidates.length==0){
            return null;
        }
        Arrays.sort(candidates);
        List<List<Integer>> resList=new ArrayList<List<Integer>>();
        List<Integer> item=new ArrayList<Integer>();
        boolean[] isVisited = new boolean[candidates.length];
        backTracking(candidates, target, 0, item, resList, isVisited);
        return resList;
    }
    public void backTracking(int[] candidates, int target, int start, List<Integer> item, List<List<Integer>> resList, boolean[] isVisited){
        if(target<0){
            return;
        }
        if(target==0){
            resList.add(new ArrayList<Integer>(item));
            return;
        }
        for(int i=start; i<candidates.length; i++){
            if(!isVisited[i]){
                if(i>0 && candidates[i] == candidates[i-1] && isVisited[i-1]==false){
                        continue;
                }
                
                item.add(candidates[i]);
                isVisited[i]=true;
                backTracking(candidates, target-candidates[i], i+1, item, resList, isVisited);
                isVisited[i]=false;
                item.remove(item.size()-1);
            }
        }
    }
}

 

posted on 2016-08-24 00:09  IncredibleThings  阅读(107)  评论(0编辑  收藏  举报