lintcode打劫房屋

2021-07-24 22:29:53 字數 1625 閱讀 1631

原題位址

題目:

假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。

給定乙個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的情況下。

您在真實的面試中是否遇到過這個題? 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 打劫房屋

假設你是乙個專業的竊賊,準備沿著一條街打劫房屋。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,表示每個房子中存放的錢,算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的...