原題位址
題目:
假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。
給定乙個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的情況下。
您在真實的面試中是否遇到過這個題? yes
樣例 給定 [3, 8, 4], 返回 8.
分析:
簡單dp題。當前房屋 i 的最大可達錢取決於dp[i - 2]和dp[i - 3]的最大值(dp[i - 4]的情況屬於dp[i - 2])。
注意返回值要為long型。
時間複雜度o(n),空間o(n)
public long houserobber(int a)
if (a.length == 1) return a[0];
dp[0] = a[0];
dp[1] = a[1];
long max = math.max(dp[0], dp[1]);
if (a.length
<= 2)
dp[2] = dp[0] + a[2];
if (dp[2] > max) max = dp[2];
for (int i = 3; i < a.length; i++)
}return
max;
}
改進的時間複雜度o(n),空間o(1),用dp1和dp2儲存dp[i - 3]和dp[i - 2]。
public long houserobber(int a)
if (a.length
< 2)
long dp1 = a[0];
long dp2 = a[1];
long max = math.max(dp1, dp2);
if (a.length == 2)
max = (dp1 + a[2]) > dp2 ? (dp1 + a[2]) : dp2;
long temp = max;
long templast = temp;
for (int i = 3; i < a.length; i++)
return
max;
}
另外一種思路:
參考**
用乙個二維陣列dp[a.length][2],其中對於第i所房子,dp[i][0]表示不打劫i,此時其能獲得的最大錢數為:
dp[i][0] = max(dp[i - 1][0] ,dp[i - 1][1])
dp[i][1]表示打劫i,其等於不打劫上一家的情況下,再加上i的錢數:
dp[i][1] = dp[i - 1][0] + a[i];
public
long
houserobber(int a)
return math.max(dp[a.length-1][0],dp[a.length-1][1]);
}
lintcode 打劫房屋
假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢,算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的...
LintCode 打劫房屋
描述 假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢,算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警...
LintCode 打劫房屋
假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢,算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的...