[LeetCode] DP 之 Maximum sum of 3 Non-Overlapping Subarrays
来源:互联网 发布:模糊决策算法原理 编辑:程序博客网 时间:2024/06/14 18:25
题目
分析
这个题目一个很巧妙的思路,就是来遍历中间的区间的起始点。
首先我们有一个数组sum,这是一个cdf,用于累加,这样的话,range(i, i+k-1) 的和就是sum[i+k] - sum[i+1]了,因为sum的第一个值为0,即起始下标实际从1开始。
然后是一个数组leftMaxIndex,注意到题目要取得是,当和相同时,起始序号最小的,因此我们可以leftMaxIndex[i]存的是range[0, i]中,取得最大和的区间的起始序号。
同理,数组rightMaxIndex, rightMaxIndex[i]中存的是range[i, n]之中,取得最大和的区间的起始序号。
得到这三个数组后,就可以通过遍历 k<= i <= n-2k (此处因为是开始序号,所以是要减去2k),根据中间的区间,来找最大的和。
时间复杂度分析
时间复杂度,4次遍历nums数组,因此时间复杂度为O(n)
代码
class Solution {public: vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) { if (nums.size() < 3*k) return vector<int>(); int n = nums.size(); vector<int> sum(1, 0), leftMaxIndex(n, 0), rightMaxIndex(n, n - k), ans(3, 0); for (int i : nums) sum.push_back(sum.back() + i); // the first is consider as sum[k] for (int i = k, max = sum[k]; i < n; i++) { if (sum[i + 1] - sum[i + 1 - k] > max) { max = sum[i+1] - sum[i+1 -k]; leftMaxIndex[i] = i+1 -k; } else { leftMaxIndex[i] = leftMaxIndex[i-1]; } } // using >= to get the left most interval. for (int i = n - k -1, max = sum[n] - sum[n - k]; i >= 0; i--) { if (sum[i+k] - sum[i] >= max) { max = max = sum[i+k] - sum[i]; rightMaxIndex[i] = i; } else { rightMaxIndex[i] = rightMaxIndex[i+1]; } } // set the middle interval for (int i = k, max = 0; i <= n - 2*k; i++) { int l = leftMaxIndex[i-1], r = rightMaxIndex[i+k]; int temp = (sum[i+k] - sum[i] + sum[l+k] - sum[l] + sum[r+k] - sum[r]); if (temp > max) { max = temp; ans = {l, i, r}; } } return ans; }};
阅读全文
0 0
- [LeetCode] DP 之 Maximum sum of 3 Non-Overlapping Subarrays
- [leetcode]Maximum Sum of 3 Non-Overlapping Subarrays
- Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- LWC 52:689. Maximum Sum of 3 Non-Overlapping Subarrays
- LeetCode689. Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- 算法练习(22):Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays 【Hard】 动态规划
- LeetCode 53. Maximum Subarrays
- leetCode:Non-overlapping Intervals
- LeetCode 435. Non-overlapping Intervals
- leetcode 435. Non-overlapping Intervals
- [Leetcode] 435. Non-overlapping Intervals
- 【LeetCode】 435. Non-overlapping Intervals
- Leetcode 435. Non-overlapping Intervals
- 方法重载
- HPU 1192
- Core Data
- NOIP2015提高D1T2 信息传递
- Qt--字符串类
- [LeetCode] DP 之 Maximum sum of 3 Non-Overlapping Subarrays
- 空间中的向量
- 算法提高 拿糖果 DP
- JFinal 中的Controller(1)
- 人工智能,机器学习和深度学习的概念区分
- LOD Group 不同 Lod 使用不同 LightMap
- Linux学习笔记一
- 计蒜客 罗马数字转换成整数
- html页面加载&渲染过程