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的更多相关文章

  1. [LintCode] Maximum Subarray 最大子数组

    Given an array of integers, find a contiguous subarray which has the largest sum. Notice The subarra ...

  2. 【leetcode】Maximum Subarray (53)

    1.   Maximum Subarray (#53) Find the contiguous subarray within an array (containing at least one nu ...

  3. 算法:寻找maximum subarray

    <算法导论>一书中演示分治算法的第二个例子,第一个例子是递归排序,较为简单.寻找maximum subarray稍微复杂点. 题目是这样的:给定序列x = [1, -4, 4, 4, 5, ...

  4. LEETCODE —— Maximum Subarray [一维DP]

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  5. 【leetcode】Maximum Subarray

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  6. maximum subarray problem

    In computer science, the maximum subarray problem is the task of finding the contiguous subarray wit ...

  7. (转)Maximum subarray problem--Kadane’s Algorithm

    转自:http://kartikkukreja.wordpress.com/2013/06/17/kadanes-algorithm/ 本来打算自己写的,后来看到上述链接的博客已经说得很清楚了,就不重 ...

  8. 3月7日 Maximum Subarray

    间隔2天,继续开始写LeetCodeOj. 原题: Maximum Subarray 其实这题很早就看了,也知道怎么做,在<编程珠玑>中有提到,求最大连续子序列,其实只需要O(n)的复杂度 ...

  9. LeetCode: Maximum Product Subarray && Maximum Subarray &子序列相关

    Maximum Product Subarray Title: Find the contiguous subarray within an array (containing at least on ...

随机推荐

  1. 理解JVM2 栈内存,方法区,堆内存

    堆,方法区,栈的关系 分配最大堆内存-Xmx32m class SimpleHeap(val id: Int){ fun show() = println("My id is $id&quo ...

  2. 加载 AssetBundle 的四种方法

    [加载 AssetBundle 的四种方法] 1.AssetBundle.LoadFromMemoryAsync(byte[] binary, uint crc = 0); 返回AssetBundle ...

  3. ubuntu下搭建node server的几个坑

    [ubuntu下搭建node server的几个坑] 1.环境变量 process.env.PORT需要使用 export PORT=80设置 windows下是set PORT=80 2.命令连结 ...

  4. Java 面向切面 AOP

    参考: :http://www.blogjava.net/supercrsky/articles/174368.html AOP: Aspect Oriented Programming 即面向切面编 ...

  5. django1.10使用本地静态文件

    django1.10使用本地静态文件方法 本文介绍的静态文件使用,是指启动web站点后,访问静态资源的用法,实际静态资源地址就是一个个的url 如果没有启动web站点,只是本地调试html页面,那直接 ...

  6. Struts1框架学习笔记

    类实现DispatchAction  类似于ActionServlet   ActionServlet 来自于 org.apache.struts.action 包,它继承自 HttpServlet, ...

  7. 在timer的时候突然改变影片简介,先前的不暂停

    import flash.display.MovieClip; import flash.utils.Timer; import flash.events.TimerEvent; var hinder ...

  8. pta l2-18(多项式A除以B)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805060372905984 题意:给定两个多项式,求出其做除法 ...

  9. 【转】iOS 自动化性能采集

      前言 对于iOS总体生态是比较封闭的,相比Android没有像adb这种可以查看内存.cpu的命令.在日常做性能测试,需要借助xcode中instruments查看内存.cpu等数据. 但是借助i ...

  10. Python+Selenium学习--上传文件

    场景 文件上传操作也比较常见功能之一,上传功能操作webdriver 并没有提供对应的方法,关键上传文件的思路.上传过程一般要打开一个系统的window 窗口,从窗口选择本地文件添加.所以,一般会卡在 ...