53. Maximum Subarray最大求和子数组12 3(dp)
[抄题]:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.
方法一:贪心算法greedy
[一句话思路]:
每次都取最大值,sum-max-sum。
[画图]:

[一刷]:
[总结]:
就是背吧。
[复杂度]:
n/1
[英文数据结构]:
Range Queries
[其他解法]:
preflix sum
[题目变变变]:
minimum Subarray最小求和子数组。*(-1)后变成copy[i],求最大,再return(-1)*copy[i]。
public class Solution {
/*
* @param nums: a list of integers
* @return: A integer indicate the sum of minimum subarray
*/
public int minSubArray(List<Integer> nums) {
// write your code here
int size = nums.size();
int[] left_min = new int[size];
int[] copy = new int[size];
/*Get negative copy*/
for(int i = 0; i < size; i++){
copy[i] = -1 * nums.get(i);
}
int max = Integer.MIN_VALUE;
int sum = 0;
int minSum = 0;
for(int i = 0; i < size; i++){
sum += copy[i];
max = Math.max(max, sum - minSum);
minSum = Math.min(sum, minSum);
}
return -1 * max;
}
}
最小
方法二:preflix sum
[一句话思路]:
[画图]:

[一刷]:
minSum = Math.min(minSum, sum);为了使得连续和最大,Sum[j] 确定的情况下,Sum[i - 1]的值越小越好.
[总结]:
也是sum-max-sum,注意minSum要取最小值。
[复杂度]:n/1
[英文数据结构]:
[其他解法]:
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 0 || nums == null) {
return -1;
}
int sum = 0;
int minSum = 0;
int max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
max = Math.max(max, sum - minSum);
minSum = Math.min(minSum, sum);
}
return max;
}
}
[题目变变变]:
2
[抄题]:
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的,返回最大的和。给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组分别为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2],它们的最大和都是 7。
[思维问题]:
以为因为两个数组不连续,不能用连续枚举。但由于是subarray所以可以。
[一句话思路]:
枚举:看哪个left[i] + right[i + 1]可以达到max
[画图]:
[一刷]:
- 用preflix sum,变量都能复用:再初始化就行。
- 最后枚举的时候不要用二元运算符,复用max就行了。
- 链表长度函数是.size,不是.sizeof
- for循环中的int i是局部变量,要重复定义
- for (int i = size - 1; i >= 0; i--) , 逆向时0也要取
- 不要妄想把隔着的几个负数挑出来,结果对了就行。最后的max是负数也得认,所以初始化max = Integer.MIN_VALUE;
[总结]:
两个量都在变,还有位置关系时,用两个数组表示。
[复杂度]:
n/1
[英文数据结构]:
[其他解法]:
[题目变变变]:
思路:左右的max分别存一个数组,然后用 max = Math.max(max, left[i] + right[i + 1]);。
这个题的思路是,因为 两个subarray 一定不重叠
所以必定存在一条分割线
分开这两个 subarrays
所以 最后的部分里:
max = Integer.MIN_VALUE;
for(int i = 0; i < size - 1; i++){
max = Math.max(max, left[i] + right[i + 1]);
}
return max;
这里是在枚举 这条分割线的位置
然后 left[] 和 right[] 里分别存的是,某个位置往左的 maximum subarray 和往右的 maximum subarray。
public class Solution {
/*
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
public int maxTwoSubArrays(List<Integer> nums) {
// write your code here
int size = nums.size();
int[] left = new int [size];
int[] right = new int [size];
//put in the left, using perflix sum
int sum = 0;
int minSum = 0;
int max = Integer.MIN_VALUE;
for (int i = 0; i < size; i++) {
sum += nums.get(i);
max = Math.max(max, sum - minSum);
minSum = Math.min(minSum, sum);
left[i] = max;
}
//put in the right, using perflix sum
sum = 0;
minSum = 0;
max = Integer.MIN_VALUE;
for (int i = size - 1; i >= 0; i--) {//0也要取
sum += nums.get(i);
max = Math.max(max, sum - minSum);
minSum = Math.min(minSum, sum);
right[i] = max;
}
//for the result
max = Integer.MIN_VALUE;
for (int i = 0; i < size - 1; i++) {
max = Math.max(max, left[i] + right[i + 1]);
}
return max;
}
}
53. Maximum Subarray最大求和子数组12 3(dp)的更多相关文章
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- 41. leetcode 53. Maximum Subarray
53. Maximum Subarray Find the contiguous subarray within an array (containing at least one number) w ...
- 53. Maximum Subarray【leetcode】
53. Maximum Subarray[leetcode] Find the contiguous subarray within an array (containing at least one ...
- Leetcode#53.Maximum Subarray(最大子序和)
题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大. 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] ...
- Leetcode之53. Maximum Subarray Easy
Leetcode 53 Maximum Subarray Easyhttps://leetcode.com/problems/maximum-subarray/Given an integer arr ...
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- LeetCode练题——53. Maximum Subarray
1.题目 53. Maximum Subarray——Easy Given an integer array nums, find the contiguous subarray (containin ...
- 刷题53. Maximum Subarray
一.题目说明 题目是53. Maximum Subarray,求最长连续子序列最大和.难度是Easy! 二.我的解答 Easy的题目,居然没做出来. 后来看了用dp方法,其中dp[i]表示以第i个元素 ...
- [Leetcode][Python]53: Maximum Subarray
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 53: Maximum Subarrayhttps://leetcode.co ...
随机推荐
- 利用Red Blob游戏介绍A*算法
转自:http://gad.qq.com/program/translateview/7194337 在游戏中,我们经常想要找到从一个位置到另一个位置的路径.我们不只是想要找到最短距离,同时也要考虑旅 ...
- javascript 中的函数声明和函数表达式区别
函数声明格式: function add(a, b) { alert(a+b); } 函数表达式格式: var add = function (a, b) { alert(a+b); } 解析器在向环 ...
- iOS Xcode 调试技巧
一 NSLog调试 官方文档:Logs an error message to the Apple System Log facility. 即NSLog不是作为普通的debug log的,而是err ...
- 【Python编程:从入门到实践】chapter2 变量和简单数据类型
2.1 运行2.2 变量 message = "hello" print(message) 2.2.1 变量的命名和使用 2.2.2 使用变量是避免命名错误2.3 字符串 “Hel ...
- https://127.0.0.1:8080/test?param={%22..报错
使用场景:spring boot 1.5.x,内置的tomcat版本为8.5.1 原因: tomcat自tomcat 8.0.35版本之后对URL参数做了比较规范的限制,必须遵循RFC 7230 an ...
- HiveThrift
Hive具有一个可选的组件叫HiveServer或HiveThrift,其允许通过指定端口访问Hive.Thrift是一种软件架构,用于跨语言的服务开发. hive最常用的访问方式是采用cli访问,不 ...
- Mysql 表名大写 找不到表
原来Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:1.用root登录,修改 /etc/my.cnf:2.在[mysqld]节点下,加入一行: lowe ...
- vue基础——列表渲染
列表渲染 用 v-for 把一个数组对应为一组元素 我们用 v-for 指令根据一组数组的选项列表进行渲染.v-for 指令需要使用 item in items 形式的特殊语法, items 是源数据 ...
- Objective C, erum 枚举类型
typedef NS_ENUM(NSInteger, MYENUM) { TYPE1, TYPE2, TYPE3 };
- javascript事件之鼠标滚轮(mousewheel)和DOMMouseScroll事件
javascript事件之鼠标滚轮(mousewheel)和DOMMouseScroll事件 发布时间:2015-02-07 编辑:www.jquerycn.cn 本文学习下,javascript ...