zoukankan      html  css  js  c++  java
  • LeetCode-53.Maximum Subarray

    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.

    public int maxSubArray(int[] nums) {//动规 my
            int re =nums[0];
            int curr = nums[0];
            for (int i = 1; i < nums.length; i++) {
                curr = curr<0?nums[i]:(nums[i]+curr);
                re = curr>re?curr:re;
            }
            return re;
        }  
    

    分治 

    public class Solution 
    {
        public int maxSubArray(int[] nums) 
        {
            // Solution 3: Divide and Conquer. O(nlogn)
            if(nums == null || nums.length == 0)
                return 0;
            
            
            return Max_Subarray_Sum(nums, 0, nums.length-1);
        }
        
        public int Max_Subarray_Sum(int[] nums, int left, int right)
        {
            if(left == right)    // base case: meaning there is only one element.
                return nums[left];
            
            int middle = (left + right) / 2;    // calculate the middle one.
            
            // recursively call Max_Subarray_Sum to go down to base case.
            int left_mss = Max_Subarray_Sum(nums, left, middle);    
            int right_mss = Max_Subarray_Sum(nums, middle+1, right);
            
            // set up leftSum, rightSum and sum.
            int leftSum = Integer.MIN_VALUE;
            int rightSum = Integer.MIN_VALUE;
            int sum = 0;
            
            // calculate the maximum subarray sum for right half part.
            for(int i=middle+1; i<= right; i++)
            {
                sum += nums[i];
                rightSum = Integer.max(rightSum, sum);
            }
            
            sum = 0;    // reset the sum to 0.
            
            // calculate the maximum subarray sum for left half part.
            for(int i=middle; i>= left; i--)
            {
                sum += nums[i];
                leftSum = Integer.max(leftSum, sum);
            }
            
            // choose the max between left and right from down level.
            int res = Integer.max(left_mss, right_mss);
            // choose the max between res and middle range.
            
            return Integer.max(res, leftSum + rightSum);
            
        }
        
    }
    

      

     

  • 相关阅读:
    内层城循环应用——买衣服
    内外层循环用法
    自定义函数的应用
    少有人走的路 随笔
    拆单发货逻辑
    拆单发货-分布页
    拆单发货-主页
    SP--report存储过程
    关于C#对Xml数据解析
    C#模拟http 发送post或get请求
  • 原文地址:https://www.cnblogs.com/zhacai/p/10429247.html
Copyright © 2011-2022 走看看