微信公衆號:Jerry的算法和NLPpython
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有必定的現金。這個地方全部的房屋都圍成一圈,這意味着第一個房屋和最後一個房屋是緊挨着的。同時,相鄰的房屋裝有相互連通的防盜系統,若是兩間相鄰的房屋在同一夜被小偷闖入,系統會自動報警。正則表達式
給定一個表明每一個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的狀況下,可以偷竊到的最高金額。算法
示例 1:數組
1輸入: [2,3,2] 2輸出: 3 3解釋: 你不能先偷竊 1 號房屋(金額 = 2),而後偷竊 3 號房屋(金額 = 2), 由於他們是相鄰的。
示例 2:微信
1輸入: [1,2,3,1] 2輸出: 4 3解釋: 你能夠先偷竊 1 號房屋(金額 = 1),而後偷竊 3 號房屋(金額 = 3)。 4 偷竊到的最高金額 = 1 + 3 = 4 。
這應該是動態規劃的一道比較中等的題目了,上一次講到的題目是他的弟弟:
Leetcode (198)| 打家劫舍
考慮全部可能的搶劫方案過於困難,並且複雜度必定會超時數據結構
這意味着要搶第一個屋,最後一個屋就不能搶
搶最後一個屋,第一個屋就不能搶
並且搶了這個第N個屋子,N+1和N-1的屋子也不能搶機器學習
首先考慮下Base case
n=0 return 0
n=1 return nums[0]
n=2 假設爲a,b要麼搶a 要麼搶b return max(nums)
n=3 假設爲a,b,c 要麼搶a,要麼b,要麼c return max(nums)ide
n=4 假設爲a,b,c,d
若是我一開始打算搶a,那麼d我是夠不着了,因此我只能從a,b,c裏進行遞歸
若是我一開始不打算搶b,那麼d是在我考慮的範圍內,我從b,c,d裏進行挑選函數
對於 n >=4,有兩個選項:
搶第1個房子,去掉最後一個房子。
不搶第1個房子,保留最後一個房子。
顯然,你想選擇數額更大的選項。因而,能夠總結出公式:
學習
因此你只須要考慮兩種狀況,而後就兩種狀況的最大值取最大便可。
代碼:
1class Solution: 2 def rob(self, nums: List[int]) -> int: 3 if not nums: 4 return 0 5 if len(nums)<=3: 6 return max(nums) 7 if len(nums)==4: 8 return max(nums[0]+nums[2],nums[1]+nums[3]) 9 step=[0 for i in range(len(nums))] 10 step[0],step[1],step[2]=nums[0],nums[1],nums[0]+nums[2] 11 for i in range(3,len(nums)-1): 12 step[i]=max(step[i-2],step[i-3])+nums[i] 13 temp=max(step) 14 step=[0 for i in range(len(nums))] 15 step[1],step[2],step[3]=nums[1],nums[2],nums[1]+nums[3] 16 for j in range(4,len(nums)): 17 step[j]=max(step[j-2],step[j-3])+nums[j] 18 temp2=max(step) 19 return max(temp,temp2)
1int rob(vector<int>& nums) 2{ 3 if (nums.size() == 1) return nums[0]; 4 5 int sumOdd[2] = {0, 0}; // 0 == head, 1 == tail 6 int sumEven[2] = { 0, 0 }; 7 for (int i = 0; i < nums.size(); i++) 8 { 9 for (int j = 0; j < 2; j++) 10 { 11 if (i == 0 && j == 1) continue; // head only 12 if (i == nums.size() - 1 && j == 0) continue; // tail only 13 if (i % 2 == 0) 14 { 15 sumOdd[j] = max(sumOdd[j], sumEven[j]); 16 sumEven[j] += nums[i]; 17 } 18 else 19 { 20 sumEven[j] = max(sumOdd[j], sumEven[j]); 21 sumOdd[j] += nums[i]; 22 } 23 } 24 } 25 26 for (int j = 0; j < 2; j++) 27 { 28 sumOdd[j] = max(sumOdd[j], sumEven[j]); 29 } 30 return max(sumOdd[0], sumOdd[1]); 31}
2020大廠筆試 | 網易提早批(1)
2020大廠筆試 | 網易提早批(2)
揹包九講(1)0/1揹包問題
揹包九講(2)徹底揹包問題
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。
▲長按加羣