LeetCode动态规划 环形子数组的最大和
給定一個由整數(shù)數(shù)組 A 表示的環(huán)形數(shù)組 C,求 C 的非空子數(shù)組的最大可能和。
此外,子數(shù)組最多只能包含固定緩沖區(qū) A 中的每個元素一次。
思路
本道題需要分類成兩種情況,題目答案為以下兩種情況的較大值。
1.最大子區(qū)間在序列的中間
這種情況是常規(guī)的最長子序列做法。
狀態(tài)轉(zhuǎn)移方程
dp[i] = max(nums[i], dp[i-1] + nums[i])
邊界條件
dp[0] = nums[0]
2.最大子區(qū)間被分割成兩部分(即頭尾各一部分)
處理分段區(qū)間比較麻煩,當(dāng)遇到最大最小問題的時候,可以想辦法將其反面轉(zhuǎn)化。可以先求出最小子區(qū)間和,然后用總區(qū)間和減去最小子區(qū)間和即可。
狀態(tài)轉(zhuǎn)移方程
dp[i] = min(nums[i], dp[i-1] + nums[i])
邊界條件
dp[0] = nums[0]
坑點
一般遇到此類的題,都需要特判一下邊界條件。本題需要注意當(dāng)總區(qū)間全為負(fù)數(shù)時,應(yīng)輸出區(qū)間中最大的一個負(fù)數(shù),而不是0。
產(chǎn)生邊界的原因:
在第二中情況下求最小子區(qū)間時,若總區(qū)間全為負(fù)數(shù),求出最小區(qū)間和即為總區(qū)間和。而本題反面轉(zhuǎn)化是基于最大子區(qū)間和最小區(qū)間是對立的,即不能有重合。如此,這種情況的最大子區(qū)間長度是0,不符合題意至少為1的條件。
代碼
class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {int dp[30005] = {0};int len = nums.size();dp[0] = nums[0];int maxn = nums[0];for(int i = 1; i < len; i++){dp[i] = max(nums[i], dp[i-1] + nums[i]);if(dp[i] > maxn)maxn = dp[i];}bool flag = true;int dp2[30005] = {0};dp2[0] = nums[0];int minn = nums[0];int sum = nums[0];if(nums[0] > 0)flag = false;for(int i = 1; i < len; i++){if(nums[i] > 0)flag = false;sum += nums[i];dp2[i] = min(nums[i], dp2[i-1] + nums[i]);if(dp2[i] < minn)minn = dp2[i];}if(flag == true)return maxn;if(sum - minn > maxn)maxn = sum - minn;return maxn;} };總結(jié)
以上是生活随笔為你收集整理的LeetCode动态规划 环形子数组的最大和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减肥期间吃黑米会发胖吗
- 下一篇: 评测OJ时间复杂度