【LeetCode】77。組み合わせ+39。組み合わせ合計+40。組み合わせ合計II

トピックリンク:77。組み合わせトピックの
説明:2つの整数nとkが与えられた場合、1 ... nのk個の数値のすべての可能な組み合わせを返します。
例:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

アイデア:従来の解決策、再帰+バックトラッキング、添え字startIndexを使用して現在の検索の開始点を示し、検索では、回答のラウンドを検索した後、このパスに現在の値を記録し、バックトラックし、最後の値を削除し、パスを変更します検索を続けます。
コード:

class Solution {
    
    
    public void dfs(int n,int startIndex,List<Integer> list,List<List<Integer>> ans,int k){
    
    
        if(k==list.size()){
    
    
            List<Integer> list1=new ArrayList<>(list);
            ans.add(list1);
            return ;
        }
        for(int i=startIndex;i<=n;i++){
    
    
            list.add(i);
            dfs(n,i+1,list,ans,k);
            list.remove(list.size()-1);
        }
    }
    public List<List<Integer>> combine(int n, int k) {
    
    
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        if(n<k||k<=0){
    
    
            return ans;
        }
        List<Integer> list=new ArrayList<>();
        dfs(n,1,list,ans,k);
        return ans;
    }
}

同様のトピック:46。完全な順列+47。完全な順列II。詳細について
39
参照してください組み合わせの合計の問題の説明:繰り返し要素のない候補の配列とターゲット番号のターゲットを指定して、番号を作成できるすべての候補を見つけます合計ターゲットの組み合わせ。

候補者の数は、制限なく繰り返し選択できます。
例:

输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

データ範囲:

1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都是独一无二的。
1 <= target <= 500

アイデア:上記のアイデアと同様ですが、ここの各要素を再利用できるため、検索するときは現在のノードから開始します。
コード:

class Solution {
    
    
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
    
    
        List<Integer> list=new ArrayList<>();
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        dfs(candidates,0,list,ans,target);
        return ans;
    }
    public void dfs(int nums[],int startIndex,List<Integer> list,List<List<Integer>> ans,int target){
    
    
        if(target<0) return;
        if(target==0){
    
    
            ans.add(new ArrayList<>(list));
            return ;
        }
        for(int i=startIndex;i<nums.length;i++){
    
    
            list.add(nums[i]);
            dfs(nums,i,list,ans,target-nums[i]);//可以重复利用每个元素,因此还是从当前位置开始搜
            list.remove(list.size()-1);
        }
    }

}

タイトルリンク:40。組み合わせ合計II
タイトル説明:候補の配列とターゲット数のターゲットが与えられた場合、数の合計をターゲットにすることができる候補のすべての組み合わせを見つけます。

候補者の各番号は、各組み合わせで1回のみ使用できます。

  • すべての数値(ターゲット数値を含む)は正の整数です。
  • ソリューションセットに繰り返しの組み合わせを含めることはできません。

例:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]

アイデア:番号は1回しか使用できません。方法は、最初に順序を並べ替えてから、2つの隣接する番号が同じである場合は直接続行して、回答の記録が繰り返されないようにすることです。

class Solution {
    
    
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
    
    
        Arrays.sort(candidates);
        List<Integer> list=new ArrayList<>();
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        dfs(candidates,target,list,ans,0);
        return ans;
    }
    public void dfs(int []nums,int target,List<Integer> list,List<List<Integer>> ans,int startIndex){
    
    
        if(target<0) return;
        if(target==0){
    
    
            List<Integer> list1=new ArrayList<>(list);
            ans.add(list1);
            return;
        }
        for(int i=startIndex;i<nums.length;i++){
    
    
            if(i>startIndex&&nums[i] == nums[i-1]) continue;//避免出现重复情况
            list.add(nums[i]);
            dfs(nums,target-nums[i],list,ans,i+1);
            list.remove(list.size()-1);
        }
    }
}

おすすめ

転載: blog.csdn.net/dl962454/article/details/115023866