Maximum Subarray LT53
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
Follow up:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
Idea 1: For all pairs of integers i and j satisfying 0 <= i <= j < nums.length, check whether the sum of nums[i..j] is greater than the maximum sum so far, take advange of:
sum of nums[i..j] = sum of nums[i..j-1] + nums[j]
the sum of all continuous subarray starting at i can be calculated in O(n), hence we have a quadratic algorithm.
Time complexity: O(n2)
Space complexity: O(1)
class Solution {
public int maxSubArray(int[] nums) {
int sz = nums.length;
int maxSumSoFar = Integer.MIN_VALUE;
for(int i = 0; i < sz; ++i) {
int sumStartHere = 0;
for(int j = i; j < sz; ++j) {
sumStartHere += nums[j];
maxSumSoFar = Math.max(maxSumSoFar, sumStartHere);
}
}
return maxSumSoFar;
}
}
Idea 1.a: With the help of a cumulative sum array, cumarr[0...i], which can be computed in linear time, it allows the sum to be computed quickly,
sum[i..j] = cumarr[j] - cumarr[i-1].
Time complexity: O(n2)
Space complexity: O(n)
class Solution {
public int maxSubArray(int[] nums) {
if(nums == null || nums.length < 1) return 0;
int sz = nums.length;
int[] cumuSum = new int[sz];
cumuSum[0] = nums[0];
for(int i = 1; i < sz; ++i) {
cumuSum[i] = cumuSum[i-1] + nums[i];
}
int maxSumSoFar = Integer.MIN_VALUE;
for(int i = 0; i < sz; ++i) {
for(int j = i; j < sz; ++j) {
int previousSum = 0;
if(i > 0) {
previousSum = cumuSum[i-1];
}
maxSumSoFar = Math.max(maxSumSoFar, cumuSum[j] - previousSum);
}
}
return maxSumSoFar;
}
}
class Solution {
public int maxSubArray(int[] nums) {
if(nums == null || nums.length < 1) return 0;
int sz = nums.length;
int[] cumuSum = new int[sz];
cumuSum[0] = nums[0];
for(int i = 1; i < sz; ++i) {
cumuSum[i] = cumuSum[i-1] + nums[i];
}
int maxSumSoFar = Integer.MIN_VALUE;
for(int j = 0; j < sz; ++j) {
maxSumSoFar = Math.max(maxSumSoFar, cumuSum[j]);
for(int i = 1; i <= j; ++i) {
maxSumSoFar = Math.max(maxSumSoFar, cumuSum[j] - cumuSum[i-1]);
}
}
return maxSumSoFar;
}
}
Idea 2: divide and conquer. Divide into two subproblems, recusively find the maximum in subvectors(max[i..k], max[k..j]) and find the maximum of crossing subvectors(max[i..k..j]), return the max of max[i..k], max[k..j] and max[i..k..j].
Time complexity: O(nlgn)
Space complexity: O(lgn) the stack
class Solution {
private int maxSubArrayHelper(int[] nums, int l, int u) {
if(l >= u) return Integer.MIN_VALUE;
int mid = l + (u - l)/2;
int leftMaxSum = nums[mid];
int sum = 0;
for(int left = mid; left >=l; --left) {
sum += nums[left];
leftMaxSum = Math.max(leftMaxSum, sum);
}
int rightMaxSum = 0;
sum = 0;
for(int right = mid+1; right < u; ++right) {
sum += nums[right];
rightMaxSum = Math.max(rightMaxSum, sum);
}
return Math.max(leftMaxSum + rightMaxSum,
Math.max(maxSubArrayHelper(nums, l, mid), maxSubArrayHelper(nums, mid+1, u)));
}
public int maxSubArray(int[] nums) {
return maxSubArrayHelper(nums, 0, nums.length);
}
}
Idea 3: Extend the solution to the next element in the array. How can we extend a solution for nums[0...i-1] to nums[0..i].
The key is the max sum ended in each element, if extending to the next element,
maxHere(i) = Math.max( maxHere(i-1) + nums[i], nums[i])
maxSoFar = Math.max(maxSoFar, maxHere)
Time compleixty: O(n)
Space complexity: O(1)
class Solution {
public int maxSubArray(int[] nums) {
int maxHere = 0;
int maxSoFar = Integer.MIN_VALUE;
for(int num: nums) {
maxHere = Math.max(maxHere, 0) + num;
maxSoFar = Math.max(maxSoFar, maxHere);
}
return maxSoFar;
}
}
Idea 3.a: Use the cumulative sum,
maxHere = cumuSum(i) - minCumuSum
cumuSum(i) = cumuSum(i-1) + nums[i]
maxSoFar = Math.max(maxSoFar, maxHere) = Math.max(maxSoFar, cumuSum - minCumuSum)
Time compleixty: O(n)
Space complexity: O(1)
class Solution {
public int maxSubArray(int[] nums) {
int min = 0;
int cumuSum = 0;
int maxSoFar = Integer.MIN_VALUE;
for(int num: nums) {
cumuSum += num;
maxSoFar = Math.max(maxSoFar, cumuSum - min);
min = Math.min(min, cumuSum);
}
return maxSoFar;
}
}
Maximum Subarray LT53的更多相关文章
- [LintCode] Maximum Subarray 最大子数组
Given an array of integers, find a contiguous subarray which has the largest sum. Notice The subarra ...
- 【leetcode】Maximum Subarray (53)
1. Maximum Subarray (#53) Find the contiguous subarray within an array (containing at least one nu ...
- 算法:寻找maximum subarray
<算法导论>一书中演示分治算法的第二个例子,第一个例子是递归排序,较为简单.寻找maximum subarray稍微复杂点. 题目是这样的:给定序列x = [1, -4, 4, 4, 5, ...
- LEETCODE —— Maximum Subarray [一维DP]
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- 【leetcode】Maximum Subarray
Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...
- maximum subarray problem
In computer science, the maximum subarray problem is the task of finding the contiguous subarray wit ...
- (转)Maximum subarray problem--Kadane’s Algorithm
转自:http://kartikkukreja.wordpress.com/2013/06/17/kadanes-algorithm/ 本来打算自己写的,后来看到上述链接的博客已经说得很清楚了,就不重 ...
- 3月7日 Maximum Subarray
间隔2天,继续开始写LeetCodeOj. 原题: Maximum Subarray 其实这题很早就看了,也知道怎么做,在<编程珠玑>中有提到,求最大连续子序列,其实只需要O(n)的复杂度 ...
- LeetCode: Maximum Product Subarray && Maximum Subarray &子序列相关
Maximum Product Subarray Title: Find the contiguous subarray within an array (containing at least on ...
随机推荐
- Failed to acquire connection "SAP_PRD_NEW.SAPSR3". Connection may not be configured correctly or you may not have the right permissions
SQLSERVER JOB无法执行 错误提示: Message Executed as user: WORKGROUP\NSDZHSCMFP01$. Microsoft (R) SQL Server ...
- python return 及lambda函数
return有两个作用: 1.用来返回函数的运行结果,或者调用另外一个函数.比如max()函数 >>> def fun(a,b): #返回函数结果. return max(a,b) ...
- Jenkins 传递自定义的参数
1.同一个job之间,不同的shell之间传递参数 注意:如果是job参数化构建自定义的参数,可以在job的不同shellj间引用,但是不能改变他的值供后面的shell使用 job在执行时会针对所 ...
- appium +ios 判断元素是否存在,排除visible=“false”的数据
问题 想要判断name=xxx的元素是否存在,存在的话进行点击,结果页面并没有展示我要的元素时也提示找到了元素 原因 ios通过driver.find_element_by_name(“name值 ...
- 使用WebStorm自动提示nodejs的有关代码
- PHP伪原创同义词替代代码示意
PHP伪原创同义词替代代码示意很多网站后台都是支持PHP,虽然用同义词百度能够识别,但至少比原封不动好些,没有AI原创NLP原创度高,但也有一定的效果.下面就是PHP代码实例: <?phpreq ...
- matlab读取excel里的数据并用imagesc画图
把矩阵数据保存在excel里 比如文件为 a.xlsx 通过下面的程序读取 a=xlsread('\文件保存的目录\a.xlsx'); figure(1); imagesc(a) colormap(h ...
- 第二章 向量(d3)有序向量:Fibonacci查找
- FortiGate软件版本升级
1.Web界面升级 1)注意:升级前,务必做好配置备份 2)要点 1.FortiGate防火墙的每款型号都有单独的版本文件,升级前务必确认下当前的设备型号: 2.升级包的后缀名必须为.out,前缀任意 ...
- java 线程Thread 技术--线程创建源码解释
永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...