1. 程式人生 > >Leetcode演算法Java全解答--39. 組合總和

Leetcode演算法Java全解答--39. 組合總和

Leetcode演算法Java全解答–39. 組合總和

題目

給定一個無重複元素的陣列 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]
]

想法

// TODO

結果

// TODO

總結

// TODO

程式碼

我的答案

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> resultList = new ArrayList<>();
        List<Integer> result = new ArrayList<>();
        Arrays.sort(candidates); // 剪枝
        dfs(candidates, resultList, result, 0, target);
        return resultList;
    }

    private void dfs(int[] candidates, List<List<Integer>> resultList, List<Integer> result, int start, int target) {
        if (target < 0){            // target不符合
            return;
        }else if (target == 0){   // target符合
            resultList.add(new ArrayList<>(result));
        }else {                  // 繼續進行數的查詢
            for (int i = start; i < candidates.length; i++){
                result.add(candidates[i]);
                dfs(candidates, resultList, result, i, target - candidates[i]);
                result.remove(result.size() - 1);     // 數查詢完後要進行回溯
            }
        }
    }
  

大佬們的答案

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        getResult(result, new ArrayList<Integer>(), candidates, target, 0);
        return result;
    }

    private void getResult(List<List<Integer>> result, List<Integer> cur, int candidates[], int target, int start) {
        if (target > 0) {
            for (int i = start; i < candidates.length && target >= candidates[i]; i++) {
                cur.add(candidates[i]);
                getResult(result, cur, candidates, target - candidates[i], i);
                cur.remove(cur.size() - 1);
            }//for
        }//if
        else if (target == 0) {
            result.add(new ArrayList<Integer>(cur));
        }//else if
    }
}

測試用例

其他

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060

相關推薦

Leetcode演算法Java解答--39. 組合總和

Leetcode演算法Java全解答–39. 組合總和 題目 給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的數字可以無限制重複被

Leetcode演算法Java解答--77. 組合

Leetcode演算法Java全解答–77. 組合 文章目錄 Leetcode演算法Java全解答--77. 組合 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案 測試用

Leetcode演算法Java解答--17. 電話號碼的字母組合

Leetcode演算法Java全解答–17. 電話號碼的字母組合 題目 給定一個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。 給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。 digitToLetter[‘2’]=“abc”;

Leetcode演算法Java解答--11. 盛最多水的容器

Leetcode演算法Java全解答–11. 盛最多水的容器 題目 盛最多水的容器 題目描述提示幫助提交記錄社群討論閱讀解答 給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i

Leetcode演算法Java解答--16. 最接近的三數之和

Leetcode演算法Java全解答–16. 最接近的三數之和 題目 給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。 示例: 例如,給定

Leetcode演算法Java解答--015. 三數之和

Leetcode演算法Java全解答–015. 三數之和 題目 給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ? 找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 示例

Leetcode演算法Java解答--12. 整數轉羅馬數字

Leetcode演算法Java全解答–12. 整數轉羅馬數字 題目 羅馬數字包含以下七種字元: I, V, X, L,C,D 和 M。 字元 數值 I 1 V 5 X 10 L

Leetcode演算法Java解答--19. 刪除連結串列的倒數第N個節點

Leetcode演算法Java全解答–19. 刪除連結串列的倒數第N個節點 文章目錄 Leetcode演算法Java全解答--19. 刪除連結串列的倒數第N個節點 題目 想法 結果 總結 程式碼 我

Leetcode演算法Java解答--21. 合併兩個有序連結串列

Leetcode演算法Java全解答–21. 合併兩個有序連結串列 文章目錄 Leetcode演算法Java全解答--21. 合併兩個有序連結串列 題目 想法 結果 總結 程式碼 我的答案

Leetcode演算法Java解答--43. 字串相乘

Leetcode演算法Java全解答–43. 字串相乘 文章目錄 Leetcode演算法Java全解答--43. 字串相乘 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案

Leetcode演算法Java解答--36. 有效的數獨

Leetcode演算法Java全解答–36. 有效的數獨 文章目錄 Leetcode演算法Java全解答--36. 有效的數獨 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案

Leetcode演算法Java解答--缺失的第一個正數

Leetcode演算法Java全解答–缺失的第一個正數 題目 給定一個未排序的整數陣列,找出其中沒有出現的最小的正整數。 示例 1: 輸入: [1,2,0] 輸出: 3 示例 2: 輸入: [3,4,-1,1] 輸出: 2 示例 3: 輸入: [7,8,9,11,12

Leetcode演算法Java解答--32. 最長有效括號

Leetcode演算法Java全解答–32. 最長有效括號 文章目錄 Leetcode演算法Java全解答--32. 最長有效括號 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案

Leetcode演算法Java解答--48.旋轉影象(Rotate Image)

Leetcode演算法Java全解答–48.旋轉影象(Rotate Image) 文章目錄 Leetcode演算法Java全解答--48.旋轉影象(Rotate Image) 題目 想法 結果 總結 程式碼

Leetcode演算法Java解答--47. 排列 II

Leetcode演算法Java全解答–47. 全排列 II 文章目錄 Leetcode演算法Java全解答--47. 全排列 II 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案

Leetcode演算法Java解答--46. 排列

Leetcode演算法Java全解答–46. 全排列 文章目錄 Leetcode演算法Java全解答--46. 全排列 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案 測

Leetcode演算法Java解答--41. 缺失的第一個正數

Leetcode演算法Java全解答–41. 缺失的第一個正數 文章目錄 Leetcode演算法Java全解答--41. 缺失的第一個正數 題目 想法 結果 總結 程式碼 我的答案 大佬們

Leetcode演算法Java解答--50. Pow(x, n)

Leetcode演算法Java全解答–50. Pow(x, n) 文章目錄 Leetcode演算法Java全解答--50. Pow(x, n) 題目 想法 結果 總結 程式碼 我的答案 大

Leetcode演算法Java解答--49. 字母異位詞分組

Leetcode演算法Java全解答–49. 字母異位詞分組 文章目錄 Leetcode演算法Java全解答--49. 字母異位詞分組 題目 想法 結果 總結 程式碼 我的答案 大佬們的答

Leetcode演算法Java解答--42.接雨水

Leetcode演算法Java全解答–42.接雨水 文章目錄 Leetcode演算法Java全解答--42.接雨水 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案 測試用