1. 程式人生 > >給定陣列,試求能否從陣列中取出n個不復用的數的和為sum

給定陣列,試求能否從陣列中取出n個不復用的數的和為sum

這是之前在一次面試中遇到的一道題,當時因為太久沒擼演算法,太久沒刷題,所以gg,現在回顧一下。

問題描述
實現一個函式,傳3個引數,指定陣列(有小數、正負數),n(取出個數),sum(指定和),輸出是否能找到這幾個數。

這和經典的湊硬幣問題其實本質上是相同的,自然可以用動態規劃來做,但這裡我們先考慮用深度搜索來做做。

關鍵就是這些邊界的選擇設定,我在這裡也調了很久,這還是得多練,熟能生巧

邊界條件

  • sum=0&n=0,成功get;
  • n<=0,這條路徑跪了;
  • n>0,繼續搜尋->>>

因為陣列中有正有負,所以sum只能用於最後的滿足判斷

處理關鍵

是各種情況都需要有確定的逐層return,因此只要你的考慮周全,邊界判斷可以靈活改變。

完整程式碼如下:成功返回true,失敗返回false

function findGroup(arr,n,sum){
    if(sum == 0 && n == 0){
        return true;
    }else if(n <= 0){
        return false;
    }
    if(n > 0)
        for(var i = 0; i < arr.length; i++){
            var temp = arr.
slice(i+1,arr.length); return findGroup(temp,n-1,sum-arr[i]) || findGroup(temp,n,sum); } }

未完…(看演算法真是又爽又痛苦,關鍵是理解)