程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Combination Sum II -- LeetCode

Combination Sum II -- LeetCode

編輯:C++入門知識

 

這道題跟Combination Sum非常相似,不了解的朋友可以先看看,唯一的區別就是這個題目中單個元素用過就不可以重復使用了。乍一看好像區別比較大,但是其實實現上只需要一點點改動就可以完成了,就是遞歸的時候傳進去的index應該是當前元素的下一個。代碼如下:

 

public ArrayList> combinationSum2(int[] num, int target) {
    ArrayList> res = new ArrayList>();
    if(num == null || num.length==0)
        return res;
    Arrays.sort(num);
    helper(num,0,target,new ArrayList(),res);
    return res;
}
private void helper(int[] num, int start, int target, ArrayList item,
ArrayList> res)
{
    if(target == 0)
    {
        res.add(new ArrayList(item));
        return;
    }
    if(target<0 || start>=num.length)
        return;
    for(int i=start;istart && num[i]==num[i-1]) continue;
        item.add(num[i]);
        helper(num,i+1,target-num[i],item,res);
        item.remove(item.size()-1);
    }
}
在這裡我們還是需要在每一次for循環前做一次判斷,因為雖然一個元素不可以重復使用,但是如果這個元素重復出現是允許的,但是為了避免出現重復的結果集,我們只對於第一次得到這個數進行遞歸,接下來就跳過這個元素了,因為接下來的情況會在上一層的遞歸函數被考慮到,這樣就可以避免重復元素的出現。這個問題可能會覺得比較繞,大家仔細想想就明白了哈。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved