批量檢測是否已經完成免密登入功能
阿新 • • 發佈:2021-09-13
難度 medium
來源:https://leetcode-cn.com/problems/combination-sum/
給定一個無重複元素的正整數陣列 candidates 和一個正整數 target ,找出 candidates 中所有可以使數字和為目標數 target 的唯一組合。
candidates 中的數字可以無限制重複被選取。如果至少一個所選數字數量不同,則兩種組合是唯一的。
對於給定的輸入,保證和為 target 的唯一組合數少於 150 個。
示例 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]]
示例 3:
輸入: candidates = [2], target = 1
輸出: []
示例 4:
輸入: candidates = [1], target = 1
輸出: [[1]]
示例 5:
輸入: candidates = [1], target = 2
輸出: [[1,1]]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每個元素都是獨一無二的。
1 <= target <= 500
解題思路:這道題目和NC46 加起來和為目標值的組合基本是一樣的,但這裡有兩個不同之處:一個是沒有重複元素,一個是元素可以複用。思路邏輯可以參考 NC46 加起來和為目標值的組合。
程式碼
class Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<>(); ArrayList<Integer> out = new ArrayList<>(); dfs(res, out, target, candidates, 0); return res; } public void dfs(List<List<Integer>> res, ArrayList<Integer> out, int target, int[] candidates, int st){ if(target<=0){ if(target<0) return; else{ List<Integer> tmp = new ArrayList<>(out); res.add(tmp); return; } } for(int i=st; i<candidates.length; i++){ out.add(candidates[i]); dfs(res, out, target-candidates[i], candidates, i); out.remove(out.size()-1); } } }
相似題目:
NC46 加起來和為目標值的組合
參考資料: