zoukankan      html  css  js  c++  java
  • 【LeetCode】53. Maximum Subarray (2 solutions)

    Maximum Subarray

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

    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.

    解法一:

    如果当前子串和小于等于0,则归零重新开始累加。记录最大子串和。

    注意:ret需要初始化为INT_MIN(以防所有都为负)。

    因此需要定义为long long类型。以防INT_MIN加上一个负数溢出。

    class Solution {
    public:
        int maxSubArray(int A[], int n) {
            long long ret = INT_MIN;
            long long cur = INT_MIN;
            for(int i = 0; i < n; i ++)
            {
                if(cur + A[i] > A[i])
                    cur += A[i];
                else
                    cur = A[i];
                ret = max(ret, cur);
            }
            return ret;
        }
    };

    或者初始化为第一个值

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            int ret = nums[0];
            int cur = nums[0];
            for(int i = 1; i < nums.size(); i ++)
            {
                cur = max(nums[i], cur+nums[i]);
                ret = max(ret, cur);
            }
            return ret;
        }
    };

    解法二:分治法。将数组分成两段A1,A2之后,就分解成为子问题了:

    1、最大子串在A1中;

    2、最大子串在A2中;

    3、最大子串是A1后缀+A2前缀。

    class Solution {
    public:
        int maxSubArray(int A[], int n) {
            if(n == 1)
                return A[0];
            else
            {
                int mid = n/2;
                //divide into [0~mid-1], [mid~n-1]
                int ret1 = maxSubArray(A, mid);
                int ret2 = maxSubArray(A+mid, n-mid);
                
                int left = mid-1;
                int ret3_1 = A[mid-1];
                int temp = A[mid-1];
                left --;
                while(left >= 0)
                {
                    temp += A[left];
                    ret3_1 = max(ret3_1, temp);
                    left --;
                }
                
                int right = mid;
                int ret3_2 = A[mid];
                temp = A[mid];
                right ++;
                while(right < n)
                {
                    temp += A[right];
                    ret3_2 = max(ret3_2, temp);
                    right ++;
                }
                
                return max(max(ret1, ret2), ret3_1+ret3_2);
            }
        }
    };

  • 相关阅读:
    编写更好的jQuery代码
    自适应网页设计(Responsive Web Design)
    精选29款非常实用的jQuery应用插件
    C# lock用法实例
    伸展树
    平衡二叉树
    搜索二叉树
    后缀表达式转为中缀表达式
    翻转链表
    双端队列
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/3771408.html
Copyright © 2011-2022 走看看