Leetcode Maximum Subarray

经典最大子串和问题,要求用两种方法实现:1、Kadane算法,复杂度O(n); 2、分治法,复杂度O(nlogn)。

1、Kadane算法:代码比较简单,但是理解需要时间。初始化ans为0, 每次用ans加上A[i]的值,并更新最大值,如果遇到ans<0,更新ans的值为0。

class Solution {
public:
    int maxSubArray(int A[], int n) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        int ans = 0, maxn = INT_MIN;
        for(int i = 0; i < n; i++){
            if(ans < 0) ans = 0;
            ans += A[i];
            maxn = max(maxn, ans); 
        }
        return maxn;
    }
};


2、分治法:最大子串和的区间有以下三种情况(low,high分别为左右边界,mid为(low+high)/2):

(1) 区间完全在 A[low,mid-1]
(2) 区间完全在 A[mid+1,high]
(3) 区间包含有 A[mid]

按照这三种情况一直递归下去即可。

class Solution {
public:
    int divide(int A[], int low, int high){
        if(low == high) return A[low];
        if(low == high-1)
            return max(A[low]+A[high], max(A[low], A[high]));
        int mid = (low+high)/2;
        int lmax = divide(A, low, mid-1);
        int rmax = divide(A, mid+1, high);
        int mmax = A[mid];
        int tmp = mmax;
        for(int i = mid-1; i >=low; i--){
            tmp += A[i];
            if(tmp > mmax)  mmax = tmp;
        }
        tmp = mmax;
        for(int i = mid+1; i <= high; i++){
            tmp += A[i];
            if(tmp > mmax)  mmax = tmp;
        }
        return max(mmax, max(lmax, rmax));
        
    }
    int maxSubArray(int A[], int n) {
        // Note: The Solution object is instantiated only once and is reused by each test case.
        return divide(A, 0, n-1);
    }
    
};


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值