力扣解題思路 打家劫舍

2021-10-07 23:02:14 字數 2204 閱讀 1153

思路:題目:

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

這一題與198. 打家劫舍 唯一的區別是此時nums可以視為乙個環形陣列,回憶一下198題,由於不可以在相鄰的房屋闖入,所以在當前位置 n 房屋可盜竊的最大值,要麼就是 n-1 房屋可盜竊的最大值,要麼就是 n-2 房屋可盜竊的最大值加上當前房屋的值,二者之間取最大值 因此可以使用動態規劃演算法:

動態規劃方程:dp[n] = math.max( dp[n-1], dp[n-2] + num ),198題的完整**如下:

public

introb

(int

nums)

return dp[nums.length]

;}

但是打家劫舍 ii顯然沒有這麼簡單,因為該陣列可以看作乙個環形,如果偷了第一家,那麼最後一家就不能偷,如果開始偷的是第二家,那麼才可以偷最後一家,那麼我們完全可以將其分成兩種情況分別處理:

public

introb

(int

nums)

for(

int i=

2;i1;i++

)return math.

max( dp1[nums.length-1]

, dp2[nums.length]);

}

當然,把這個動態規劃封裝成乙個函式myrob也可以,封裝好了就可以直接呼叫了,例如:

return math.

max(

myrob

(arrays.

copyofrange

(nums,

0, nums.length -1)

), myrob

(arrays.

copyofrange

(nums,

1, nums.length)

)

思路:在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。

這一題與上面幾題的區別是這一題考察到了樹,那麼對於任意乙個節點,我們可以選擇搶或者不搶該節點,然後我們對每個節點進行遞迴,計算搶該節點和不搶該節點所能得到的最大金額,將其儲存在乙個二元陣列中。

但是我最開始想的是,乙個節點偷與不偷是與其父節點有關的,那麼我們遍歷的時候是否需要記錄其父節點的二元陣列呢?其實是沒必要的,因為我們採用遞迴的方式,實際上只有遞迴到葉子節點陣列才會有值,然後再從葉子節點更新到根節點。因此,無需記錄父節點陣列,只需記錄其子節點陣列即可,將其作為返回值不就行了嗎。

則有:

result[0]

= math.

max(left[0]

, left[1]

)+ math.

max(right[0]

, right[1]

);//計算不搶劫當前根節點可獲得的最大金額(那麼其左右子樹可以隨便搶)

result[1]

= left[0]

+ right[0]

+ root.val;

//計算若搶劫根節點可獲得的最大金額(此時,其左右子樹的根節點不能被搶)

這樣最終計算出的二元陣列取其中乙個最大值就是我們的答案了,完整**如下:

public

introb

(treenode root)

public

int[

]robinternal

(treenode root)

當然也可以不用陣列來存放結果,這樣就不用另寫遞迴函式了:

public

introb

(treenode root)

是不是更簡單呢(✿◕‿◕✿)

力扣解題思路 素數

首先,如何判斷乙個數是否為素數呢,首先我們知道最小的素數是2,那麼我們從2開始判斷該數是否能找到被除數即可,完整 如下 public boolean isprimenum int i return true 思路 統計所有小於非負整數 n 的質數的數量。那麼這一題我們需要對每個小於n的數進行判斷一次...

力扣解題思路 區間排序問題

思路 每次遇到和區間有關的題都要思考半天區間的排序方法,是根據區間左邊排序還是根據區間右邊排序呢?另外遇到這種題目如果採取貪心演算法最後的結果會不會是最優的呢?主要是因為研究生期間我的研究方向是強化學習演算法,其中用到的貪婪演算法容易陷入區域性最優,所以每次看到適合用貪婪演算法解題的題目時總會思考貪...

力扣解題思路 169 多數元素

思路 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。首先最直觀的方法就是先排序,最中間那個數出現次數一定多於 n 2。public intmajorityelement int nums 這種方...