1. 程式人生 > >[LeetCode javaScript] 198. 打家劫舍

[LeetCode javaScript] 198. 打家劫舍

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定一個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 1:

輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
示例 2:

輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12 。

/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function(nums) {
   /*
   遞迴寫法,此處會超時,僅做參考
  var t=nums.length;
 if(t==0){
        return 0;
    }else if(t==1){
        return nums[0];
    }
    else if(t==2){
        return nums[1]>nums[0]?nums[1]:nums[0];
    }else{
        var t1=rob(nums.slice(0,-2))+nums[nums.length-1];
        var t2=rob(nums.slice(0,-1))
        return t1>t2?t1:t2;
    }
    */
    //非遞迴寫法,用一個數組儲存重複的子問題解
    var count=[];
    if(nums.length==0){return 0;}
    //max用來儲存當前的最大值
    var max=nums[0];
    for(var i=0;i<nums.length;i++){
        if(i==0){
            count.push(nums[0]);
        }else if(i==1){
            count.push(nums[1]>nums[0]?nums[1]:nums[0]);
            if(max<count[count.length-1]){max=count[i]}
        }else{
        //兩種情況
            var t1=count[i-2]+nums[i];
            var t2=count[i-1];
            count.push(t1>t2?t1:t2);
            if(max<count[count.length-1]){max=count[i]}
        }
    }
    return max;
};