LeetCode題目:39. 組合總和 解題思路及Java實現

adrian_hk發表於2020-11-23

題目:
給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的數字可以無限制重複被選取。

說明:

所有數字(包括 target)都是正整數。
解集不能包含重複的組合。
示例 1:

輸入:candidates = [2,3,6,7], target = 7,
所求解集為:
[
[7],
[2,2,3]
]
示例 2:

輸入: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
解題思路:首先對陣列進行排序,然後通過回溯解決。回溯方法中傳入原陣列,目標值,及index,終止條件index等於陣列長度。

package top100;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Demo39 {
    List<List<Integer>> results = new ArrayList<>();
    List<Integer> result = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates,int target){
        //先將陣列進行排序
        Arrays.sort(candidates);
        getResults(candidates,target,0);
        return results; 
    }

    private void getResults(int[] candidates, int target, int index) {//傳一下下標,或者使用for迴圈
        //沒找到符合條件的
        if(index == candidates.length)
            return;
        //找到了 滿足條件
        if(target == 0){
            results.add(new ArrayList<>(result));//不能直接新增result到results  result為引用,List裡的內容一直在改變
            return;
        }
        //因為陣列經過排序 當target比當前下標對應的元素小,說明這條路徑找不到滿足條件的結果了
        if (target<candidates[index])
            return;
        result.add(candidates[index]);
        getResults(candidates,target-candidates[index],index);
        result.remove(result.size()-1);
        getResults(candidates,target,index+1);
    }
}

相關文章