689. Maximum Sum of 3 Non-Overlapping Subarrays三个不重合数组的求和最大值
[抄题]:
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum.
Each subarray will be of size k, and we want to maximize the sum of all 3*k entries.
Return the result as a list of indices representing the starting position of each interval (0-indexed). If there are multiple answers, return the lexicographically smallest one.
Example:
Input: [1,2,1,2,6,7,5,1], 2
Output: [0, 3, 5]
Explanation: Subarrays [1, 2], [2, 6], [7, 5] correspond to the starting indices [0, 3, 5].
We could have also taken [2, 1], but an answer of [1, 3, 5] would be lexicographically larger.
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
note中已经提示了length,就只需要考虑k k&length的关系就了
把“前i项”初始化为“第i项”,方便直接做差
for (int i = 1; i <= n; i++) {
sums[i] = sums[i - 1] + nums[i - 1];
}
[思维问题]:
不知道为什么要用DP:每次都保存之前一组的状态,然后一个个向前更新和比价。
求一组固定为k长度的数组时可用。
//总和=本组和+之前组的和=本组最后之和-本组第一之和+之前的(从j - k开始的)dp求和值
int curSum = sums[j] - sums[j - k] + dp[i - 1][j - k];
[英文数据结构或算法,为什么不用别的数据结构或算法]:
dp数组里存储了结果,可以通过不断输入index来把结果取出来:
int index = n;
for (int i = 2; i >= 0; i--) {
res[i] = pos[i + 1][index];
System.out.println("index = " +index);
System.out.println("res[i] = pos[i + 1][index] = " +res[i]); index = res[i];
System.out.println("index = " +index);
System.out.println("----------------"); }
[一句话思路]:
按照第123组来操作,
总和=本组和+之前所有组的和
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:

[一刷]:
- 序列型dp所有的有关数组、有关二维数组都要增加1个单位,调用的时候也要+1,因为第一位拿来初始化了。不初始化就是默认为0
[二刷]:
- 发现把第0位给去掉了 不知道为何:
[1,2,1,2,6,7,5,1]
2 i = 1
i - 1 = 0
nums[i - 1] = 1
sum[i - 1] = 0
sum[i - 1] = 1
---------------
i = 2
i - 1 = 1
nums[i - 1] = 2
sum[i - 1] = 0
sum[i - 1] = 2
---------------
i = 3
i - 1 = 2
nums[i - 1] = 1
sum[i - 1] = 0
sum[i - 1] = 1
---------------
i = 4
i - 1 = 3
nums[i - 1] = 2
sum[i - 1] = 0
sum[i - 1] = 2
---------------
i = 5
i - 1 = 4
nums[i - 1] = 6
sum[i - 1] = 0
sum[i - 1] = 6
---------------
i = 6
i - 1 = 5
nums[i - 1] = 7
sum[i - 1] = 0
sum[i - 1] = 7
---------------
i = 7
i - 1 = 6
nums[i - 1] = 5
sum[i - 1] = 0
sum[i - 1] = 5
---------------
i = 8
i - 1 = 7
nums[i - 1] = 1
sum[i - 1] = 0
sum[i - 1] = 1
---------------
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
dp是存储一组状态的,可以拿来调用
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[算法思想:迭代/递归/分治/贪心]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
[是否头一次写此类driver funcion的代码] :
class Solution {
public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
//ini: res[3], pos[4][n + 1], dp[4][n + 1]
int n = nums.length;
int[] res = new int[3];
int[] sum = new int[n + 1];
int[][] pos = new int[4][n + 1];
int[][] dp = new int[4][n + 1];
//cc
if (nums == null || nums.length < 3 * k) return res;
//ini:sum
for (int i = 1; i <= n; i++) {
int j = i - 1;
System.out.println("i = "+i);
System.out.println("i - 1 = "+j);
System.out.println("nums[i - 1] = "+nums[i - 1]);
System.out.println("sum[i - 1] = "+sum[i - 1]);
sum[i - 1] = sum[i - 1] + nums[i - 1];
System.out.println("sum[i - 1] = "+sum[i - 1]);
System.out.println("---------------");
}
for (int i = 1; i <= 3; i++) {
for (int j = k * i; j <= n; j++) {
int curSum = sum[j] - sum[j - k] + dp[i - 1][j - k];
if (curSum > dp[i][j - 1]) {
dp[i][j] = curSum;
pos[i][j] = j - k;
}else {
dp[i][j] = dp[i][j - 1];
pos[i][j] = pos[i][j - 1];
}
}
}
//retrieve the answer
int index = n;
for (int i = 2; i >= 0; i--) {
//
res[i] = pos[i + 1][index];
index = res[i];
}
//return
return res;
}
}
689. Maximum Sum of 3 Non-Overlapping Subarrays三个不重合数组的求和最大值的更多相关文章
- [leetcode]689. Maximum Sum of 3 Non-Overlapping Subarrays三个非重叠子数组的最大和
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum. E ...
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum. E ...
- LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
原题链接在这里:https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/ 题目: In a given arr ...
- [LeetCode] 689. Maximum Sum of 3 Non-Overlapping Subarrays 三个非重叠子数组的最大和
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum. E ...
- 【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
题目如下: In a given array nums of positive integers, find three non-overlapping subarrays with maximum ...
- 【LeetCode】689. Maximum Sum of 3 Non-Overlapping Subarrays 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/maximum- ...
- [LeetCode] Maximum Sum of 3 Non-Overlapping Subarrays 三个非重叠子数组的最大和
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum. E ...
- [Swift]LeetCode689. 三个无重叠子数组的最大和 | Maximum Sum of 3 Non-Overlapping Subarrays
In a given array nums of positive integers, find three non-overlapping subarrays with maximum sum. E ...
- [Swift]LeetCode1031. 两个非重叠子数组的最大和 | Maximum Sum of Two Non-Overlapping Subarrays
Given an array A of non-negative integers, return the maximum sum of elements in two non-overlapping ...
随机推荐
- jmeter数据关联_后置处理器_正则表达式提取器
- java代码------实现从控制台输入整型,
总结:主要是方法的调用不能错,比如浮点型,整型,字节型,so.on int ====hasNextInt() float--------hasNextfloat() short ====hasNext ...
- 第六章 通过Service访问Pod(上)
不应该直接使用Pod的ID地址作为对外提供服务的接口,应为一旦Pod重启,IP地址就变化了,解决方案是使用Service. 6.1 创建Service K8s service从逻辑上代表了一组Pod, ...
- Android笔记——对系统通话记录的删除操作
手机通话记录是保存在数据库中的,位置: /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls 这张表中有个 ...
- wampserver提示You don't have permission to access
在wampserver上单击左键,打开菜单中Apache下的httpd.conf 注视掉以下代码 <Directory “C:/wamp/www”> Deny from all Allo ...
- springmvc 使用ajx上传文件 不设置form enctype
最近在做一个小项目 碰到这个问题 解决方案如下 1.js代码如下 获取当前form 转换为formdata ajax提交到后台 var form = $("#importForm" ...
- Python Twisted系列教程21: Twisted和Haskell
作者:dave@http://krondo.com/twisted-and-haskell/ 译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted ...
- eclipse项目推送git
引用:http://blog.csdn.net/zongzhankui/article/details/48653731
- Android Studio里面配置Tesseract
网上大多是eclipse的项目,因为我用的是AS,所以说一下怎么配置. 身份证图片资料来自百度. 一.导入相关文件 其实我们不用自己编译,可以把别人项目编译好的jar包和so库直接拿来用.因为识别的效 ...
- 搞点事情,使用node搭建反向代理
导语 最近有个需求,需要对业务管理后台的操作记录进行上报.一般这种上报需求都是又后台同学来做比较合适的.但是因为后台人力的原因.这个工作落到了我这个小前端的头上.这里记录下做这个需求踩的一些坑. 一. ...