• 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);
            
        }
        
    }
    

      

     

  • 相关阅读:
    xCode中怎样保存自己的代码块
    2015-03-13---抽象工厂(附代码),
    java nio 缓冲区(一)
    MFC获取各个窗体(体)之间的指针(对象)
    自己动手写神经网络,自己真的能够动手写神经网络嘛?
    Android招財进宝手势password的实现
    QQ三方登录
    UVA 10561
    Vagi单点登录1.0
    《反脆弱》:软件业现成的鲁棒性(Robust)换了个说法变成了作者的发明,按作者的理论推导出许多可笑愚蠢的原则来
  • 原文地址:https://www.cnblogs.com/zhacai/p/10429247.html
Copyright © 2020-2023  润新知