My Eighty-second Page - 打家劫舍Ⅱ - By Nicolas
這篇page是針對leetcode上的213.打家劫舍Ⅱ所寫的。小尼先簡單的說明一下這道題的意思,就是我們還是以小偷的身份去進行偷竊,我們這一次我們給出的房間的第一間和最后一間是連在一起構成一個環形的結構,同樣我們每一個房間里面都有對應的金額可以進行對應的偷取,我們需要求的就是我們在不報警的條件下求出我們可以偷竊的最大的金額(其中觸發報警的條件跟打家劫舍一樣,就是我們如果晚上偷竊了連續的兩個房間,就會觸發報警)
小尼先簡單的分析一下這道題的思路,其實這都題的思路還是比較簡單的,其實我們可以細細的分析,我們為了避免環結構對我們的困擾,我們分成了三種情況,第一種就是我們只考慮不包含首尾元素的情況;第二種就是我們考慮包含首元素,不包含尾部元素的情況;第三種就是我們考慮包含尾元素,不包含首元素的情況。我們分析了之后也可以知道,我們的第一種情況其實就是包含了我們的第二種第三種情況/
小尼接下來拉一下這道題的解題的代碼:
class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0)return 0;int len = nums.length;if (len == 1)return nums[0];return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));}int robAction(int[] nums, int start, int end) {int x = 0, y = 0, z = 0;for (int i = start; i < end; i++) {y = z;z = Math.max(y, x + nums[i]);x = y;}return z;} }其實這道題的解法也是有巧妙之處,我們先排除了特殊的情況,然后我們在開始做了判斷,我們求出了兩種情況下的二值再取兩者中的最大值,我們在取值的for循環中,其中有一點運用的非常巧妙,我們這里定義了x,y,z三個值,這三個值小尼一一跟大家說明一下它們的作用以及記錄的是哪些值,x永遠記錄的都是最前面的值,我們的i在不斷往后遍歷取nums[i]的時候,我們的x都是與i取到的nums[i]相隔一個位置的距離,這樣我們的x+nums[i]才可以表示我們偷取了之后的值,然后y記錄的一直都是x之后,nums[i]之前的那個值,我們在其中z表示最后的結果,比較的就是其中y與x+nums[i]的值
總結
以上是生活随笔為你收集整理的My Eighty-second Page - 打家劫舍Ⅱ - By Nicolas的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火狐书签栏 谷歌_适用于Firefox的
- 下一篇: 谷歌工具栏不再支持火狐浏览器