iT邦幫忙

2024 iThome 鐵人賽

0
佛心分享-刷題不只是刷題

刷經典 LeetCode 題目系列 第 35

經典LeetCode 39. Combination Sum

  • 分享至 

  • xImage
  •  

題目:
給定一個由正整數組成的陣列 candidates 和一個目標數字 target,找出候選陣列中可以讓數字相加等於目標數字的所有唯一組合

  • 同一個數字可以在組合中出現多次。
  • candidates 中的數字都是獨特的。
  • 組合中的數字可以以任何順序回傳。

範例:

Input: candidates = [2,3,6,7], target = 7
Output: [[2,2,3],[7]]

Input: candidates = [2,3,5], target = 8
Output: [[2,2,2,2],[2,3,3],[3,5]]

限制條件:

  • 1 ≤ candidates.length ≤ 30
  • 1 ≤ candidates[i] ≤ 200
  • candidate 中的所有元素互不相同。
  • 1 ≤ target ≤ 500

解題思路

遍歷所有組合,當前組合不行的話就往上一步,再繼續嘗試下一個組合

每嘗試一個 candidates[i],target 就減去 candidates[i],然後再嘗試下一個排列組合,直到 target == 0 表示剛好找到一個組合,那就把這組合加入 result 結果裡。

實作:

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> result;
        vector<int> combination;
        backtrack(candidates, target, combination, result, 0);
        return result;
    }
private:
    void backtrack(vector<int>& candidates, int target, vector<int>& combination, vector<vector<int>>& result, int start) {
        if (target == 0) {
            result.push_back(combination);
            return;
        }

        if (target < 0) return;

        for (int i = start; i < candidates.size(); i++) {
            combination.push_back(candidates[i]);
            backtrack(candidates, target-candidates[i], combination, result, i);
            combination.pop_back();
        }
    }
};

參考:
#39. Combination Sum


上一篇
經典LeetCode 213: House Robber II
下一篇
經典LeetCode 300. Longest Increasing Subsequence
系列文
刷經典 LeetCode 題目36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言