leetcode打家劫舍1,2,3(dp 遞迴)

2021-09-25 17:13:44 字數 2865 閱讀 5553

leetcode打家劫舍1

題意:給定乙個陣列,相鄰的數字不能相加,其餘數字可以任意相加,問在次情況下最大和是多少

思路:理解題意後就能明白這道題的和最大和是個動態增長的過程而且依賴之前求出來的最大和,我們可以用dp來解決。

dp的動態方程為dp[i] = max(dp[i-2]+nums[i],dp[i-1])

**如下:

public

introb

(int

nums)

if(nums.length==1)

if(nums.length==2)

int[

] dp =

newint

[nums.length]

; dp[0]

= nums[0]

; dp[1]

= nums[1]

; dp[1]

= math.

max(dp[0]

,dp[1]

);dp[2]

= dp[0]

+nums[2]

; dp[2]

= math.

max(dp[2]

,dp[1]

);for(

int i =

2;i)return dp[nums.length-1]

;}

繼續對**空間複雜度,因為我們只用到dp[i-2]和dp[i-1]之前的資料用不上了可以用兩個臨時變數來儲存。

優化後**如下:

public

introb

(int

num)

return currmax;

}

leetcode打家劫舍2

題意:在1的基礎上頭和尾也不能相鄰了

思路:對於最大和的影響將分成兩種情況

1.搶劫了頭但不搶劫尾 即0-n-1

2.不搶街頭但搶劫了尾 即1-n

對2者維護最大ans即可

**如下:

class

solution

if(nums.length==1)

if(nums.length==2)

int[

] dp =

newint

[nums.length]

; dp[0]

= nums[0]

; dp[1]

= nums[1]

; dp[1]

= math.

max(dp[0]

,dp[1]

);dp[2]

= dp[0]

+nums[2]

; dp[2]

= math.

max(dp[2]

,dp[1]

);for(

int i =

2;i)return dp[nums.length-1]

;}public

introb

(int

nums)

if(nums.length==1)

return math.

max(

robs

(arrays.

copyofrange

(nums,

0,nums.length-1)

),robs

(arrays.

copyofrange

(nums,

1,nums.length)))

;}}

leetcode打家劫舍3

題意:在二叉樹型別的房屋中打劫,依舊滿足相連線的點不能搶

思路:遞迴維護每個結點的兩種情況

1.有頭結點參與+孫子結點的和

2.無頭結點參與+兒子結點的和

**如下:

class

solution

int lval =

rob(root.left)

;int rval =

rob(root.right)

;int llval =0;

int lrval =0;

int rrval =0;

int rlval =0;

if(root.left!=null)

if(root.right!=null)

return math.

max(lval+rval,llval+lrval+rrval+rlval+root.val);}

}

繼續根據這一思路優化

class

solution

public

int[

]dorob

(treenode root)

int[

] left =

dorob

(root.left)

;int

right =

dorob

(root.right)

; res[0]

= math.

max(left[0]

,left[1]

)+math.

max(right[0]

,right[1]

);res[1]

= root.val+left[0]

+right[0]

;return res;

}}

LeetCode 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

leetcode 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

leetcode 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...