1. 程式人生 > >LeetCode--39. Combination Sum

LeetCode--39. Combination Sum

題目連結: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);
        }
    }
}