LeetCode 53. Maximum Subarray

原題連接在這裏:https://leetcode.com/problems/maximum-subarray/html

題目:post

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.url

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.spa

題解:.net

採用的是DP解法. 把原有問題拆成小問題. maxSubArray(int [] nums, int i). 表示到 [0,i]段最大的sub array. 前提是包括 i 元素.code

maxSubArray(nums, i) = nums[i] + maxSubArray(nums, i-1) > 0 ? maxSubArray(nums, i-1) : 0.htm

同時維護全局最大值.blog

歷史信息就是local[i-1] 和 global[i-1], 更新當前信息時先更新局部最優.leetcode

local[i] = Math.max(local[i-1]+nums[i], nums[i]), 有可能local[i-1]是負數,就直接取nums[i], 而後更新全局最優.get

global[i] = Math.max(lcoal[i], global[i-1]), 要麼是原來的全局最優,要麼是局部最優,此時能涵蓋全部解。若是全局最優不包含當前值,那麼會被維護在global[i-1]中,若包含當前值,那麼就是local[i].

Note: local, global的初始化是nums[0]. 不能初始化成0, 而後從i=1開始,好比[-1], Output:0, Expected:-1, 這種corner case 就會出錯.

Time Complexity: O(n).n = nums.length.

Space: O(1).

AC Java:

 1 public class Solution {
 2     public int maxSubArray(int[] nums) {
 3         if(nums == null || nums.length ==0){
 4             return 0;
 5         }
 6         int global = nums[0];
 7         int local = nums[0];
 8         for(int i = 1; i< nums.length; i++){
 9             local = Math.max(local + nums[i], nums[i]);
10             global = Math.max(global, local);
11         }
12         return global;
13     }
14 }

相似Maximum Product SubarrayHouse RobberBest Time to Buy and Sell Stock., Longest Turbulent Subarray.

跟上Maximum Subarray II.

Reference: http://blog.csdn.net/linhuanmars/article/details/21314059

相關文章
相關標籤/搜索