LeetCode小演算法記錄(五十七)打家劫舍

2021-10-23 04:22:42 字數 1499 閱讀 5755

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

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

示例 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 。

package leetcodetest;

public class 打家劫舍 ;

int rob = rob(nums);

system.out.println("rob = " + rob);

}/**

* 傳統線性規劃方法,每一位與前面i-1位的值分別相加,然後取得結果最大值新增到sum陣列中。

* @param num

* @return

*/// public static int rob(int nums)

// temp = math.max(temp,sum[i]);

// }

// system.out.println(arrays.tostring(sum));

// return temp;

// }

/*** 考慮所有可能的搶劫方案過於困難。乙個自然而然的想法是首先從最簡單的情況開始。記:

** f(k) = 從前 k 個房屋中能搶劫到的最大數額,a_i = 第 i 個房屋的錢數。

* 首先看 n = 1 的情況,顯然 f(1) = a_1。

* 再看 n = 2,f(2) = max(a_1,a_2)。

* 對於 n = 3,有兩個選項:

* 1.搶第三個房子,將數額與第乙個房子相加。

** 2.不搶第三個房子,保持現有最大數額。

* 顯然,你想選擇數額更大的選項。於是,可以總結出公式:

* f(k) = max(f(k – 2) + a_k,f(k – 1))

* 我們選擇 f(–1) = f(0) = 0 為初始情況,這將極大地簡化**。

* 答案為 f(n)。可以用乙個陣列來儲存並計算結果。不過由於每一步你只需要前兩個最大值,

* 兩個變數就足夠用了。

** @param num

* @return

*/public static int rob(int num)

return currmax;

}}

LeetCode小演算法記錄(一)

給定兩個排序後的陣列 a 和 b,其中 a 的末端有足夠的緩衝空間容納 b。編寫乙個方法,將 b 合併入 a 並排序。初始化 a 和 b 的元素數量分別為 m 和 n。示例 輸入 a 1,2,3,0,0,0 m 3 b 2,5,6 n 3 輸出 1,2,2,3,5,6 package leetcod...

LeetCode小演算法記錄(八十二)硬幣

硬幣。給定數量不限的硬幣,幣值為25分 10分 5分和1分,編寫 計算n分有幾種表示法。結果可能會很大,你需要將結果模上1000000007 示例1 輸入 n 5 輸出 2 解釋 有兩種方式可以湊成總金額 5 55 1 1 1 1 1 示例2 輸入 n 10 輸出 4 解釋 有四種方式可以湊成總金額...

Leetcode第五十題 Pow x, n

題目 實現 pow x,n 即計算 x 的 n 次冪函式。示例 1 輸入 2.00000,10 輸出 1024.00000 示例 2 輸入 2.10000,3 輸出 9.26100 示例 3 輸入 2.00000,2 輸出 0.25000 解釋 2 2 1 22 1 4 0.25 說明 100.0 ...