leetcode--动态规划(Easy)
2019.08.18
53.最大子序和
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
示例:
輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6
關鍵:令狀態 dp[k] 表示以 nums[k] 結尾的連續序列的最大和
狀態轉移方程:dp[k] = max(nums[k], dp[k-1]+nums[k])
70. 爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
第 i 階可以由以下兩種方法得到:
- 在第 (i?1) 階后向上爬一階。
- 在第 (i?2)階后向上爬 2 階。
所以到達第 i 階的方法總數就是到第 (i?1) 階和第 (i?2) 階的方法數之和。
關鍵:令 dp[i]表示能到達第 i 階的方法總數
狀態轉移方程:dp[i] = dp[i?1] + dp[i?2]
746. 使用最小花費爬樓梯
數組的每個索引做為一個階梯,第 i個階梯對應著一個非負數的體力花費值 costi。
每當你爬上一個階梯你都要花費對應的體力花費值,然后你可以選擇繼續爬一個階梯或者爬兩個階梯。
您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引為 0 或 1 的元素作為初始階梯。
注意:
cost 的長度將會在 [2, 1000]。
每一個 cost[i] 將會是一個Integer類型,范圍為 [0, 999]。
示例 1:
輸入: cost = [10, 15, 20]
輸出: 15
解釋: 最低花費是從cost[1]開始,然后走兩步即可到階梯頂,一共花費15。
示例 2:
輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
輸出: 6
解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。
121.買股票的最佳時機
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。
注意 你不能在買入股票前賣出股票。
示例 1:
輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格。
示例 2:
輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。
303. 區域和檢索 - 數組不可變
給定一個整數數組 nums,求出數組從索引 i 到 j (i ≤ j) 范圍內元素的總和,包含 i, j 兩點。
說明:
你可以假設數組不可變。
會多次調用 sumRange 方法。
示例:
給定 nums = [-2, 0, 3, -5, 2, -1],求和函數為 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
說明中提到“會多次調用 sumRange 方法”,所以每次都逐個相加計算子區間的和不是理想的做法,
可以使用 dp[i] 存儲 nums 前 i 個元素的和,則可得到 i-j 子區間的和為 sum[j] - sum[i-1]。
198. 打家劫舍
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 , 偷竊 3 號房屋 ,接著偷竊 5 號房屋。偷竊到的最高金額 = 2 + 9 + 1 = 12 。
可理解為:最大不連續子列和
關鍵:令 dp[i] 表示從下標為0的房間盜竊到下標為 i 的房間時可以盜竊的最大金額。
狀態轉移方程:dp[i] = max(dp[i-1], dp[i-2] + nums[i])
注意理解:
- 如果 nums[i-1] 被盜,那么 nums[i] 一定不能盜,所以選擇 max(dp[i-1], dp[i-2] + nums[i])
- 如果 nums[i-1] 沒有被盜,那說明 dp[i-1] = dp[i-2] ,即dp[i-1]中保留了到 i-2 時的最大值,則
nums[i] 一定要被包含進去
213. 打家劫舍Ⅱ
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。
這個地方所有的房屋都圍成一圈,這意味著第一個房屋和最后一個房屋是緊挨著的。
同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [2,3,2]
輸出: 3
解釋: 你不能先偷竊 1 號房屋(金額 = 2),然后偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。
示例 2:
輸入: [1,2,3,1]
輸出: 4
解釋: 你可以先偷竊 1 號房屋(金額 = 1),然后偷竊 3 號房屋(金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
升級版加了限制條件:第一間屋子和最后一間屋子不能同時被搶。即,要么搶第一間,要么搶最后一間。
因此,可以把問題拆分為兩個基礎版的打家劫舍:
- 去掉第一間,打劫一次
- 去掉最后一間,打劫一次
- 取兩次打劫能獲得的最大值
總結
以上是生活随笔為你收集整理的leetcode--动态规划(Easy)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue源码探究笔记
- 下一篇: Tensorflow2.0模型构建与训练