LeetCode--39. Combination Sum
阿新 • • 發佈:2018-12-21
題目連結:https://leetcode.com/problems/combination-sum/
這是一個組合和的問題,備選數組裡的數不重複,但是可以選擇相同的數。肯定要用到回溯(backtrace)遞迴的方法。
我寫遞迴時喜歡用一個靜態list來存最終返回的答案,再開一個較大的靜態陣列來存臨時答案。
下面考慮遞迴函式怎麼寫,被選陣列和目標和肯定是一直要帶的引數,需要一個idx變數來標記某次遞迴函式呼叫時在原陣列中搜索的起點,這裡因為可以重複選,因此起點可以在下一次遞迴函式呼叫時重複取到。還有因為儲存在靜態陣列中的有效答案需要一個變數來記錄,並隨著陣列向後搜尋呼叫遞迴函式時自動增加。具體程式碼如下:
class Solution { public static List<List<Integer>> ret; public static int[] record=new int[100000]; public static List<List<Integer>> combinationSum(int[] candidates, int target) { ret=new LinkedList<>(); recursive(candidates,0,target,0); return ret; } public static void recursive(int[] candidates,int idx,int target,int length) { if(target==0) { LinkedList<Integer> tmp=new LinkedList(); for(int i=0;i<length;i++) tmp.add(record[i]); ret.add(tmp); return; } if(target<0 || idx>=candidates.length) return; for(int i=idx;i<candidates.length;i++) { record[length]=candidates[i]; recursive(candidates,i,target-candidates[i],length+1); } } }