40. 组合总和 II(包含重复数字)

第一次还申请了一个used[]数组,借鉴了全排列去重的思路。
看了题解才知道,排序后只要判断i>begin就行了,妙啊。
放过不同层级的相同数字,不放过同一层级的相同数字,具体解释在评论区:

40题解

class Solution {
    LinkedList<List<Integer>> ans=new LinkedList<>();
    LinkedList<Integer> path=new LinkedList<>();
    //boolean[] used;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
    //used=new boolean[candidates.length];
    Arrays.sort(candidates);
    dfs(candidates,target,0);
    return ans;
    }
    void dfs(int[] candidates,int target,int begin){
     if(target==0){
         ans.add(new LinkedList(path));
         return;
     }  
     if(target<0)return; 
     for(int i=begin;i<candidates.length;i++){
         //if(i>0&&candidates[i]==candidates[i-1]&&!used[i-1])
         if(i>begin&&candidates[i]==candidates[i-1])//去重关键。
            continue;
        //if(!used[i]){
          path.add(candidates[i]);
          //used[i]=true;
         dfs(candidates,target-candidates[i],i+1);//下次不用选这个,这里是i+1
         //used[i]=false;
         path.removeLast();
        //}
        
     }


    }
}

这道题用二叉树的形式怕是很难精简。

posted @ 2021-04-24 21:46  wsshub  阅读(73)  评论(0)    收藏  举报