zoukankan      html  css  js  c++  java
  • LeetCode Maximum Subarray

    class Solution {
    public:
        int maxSubArray(int A[], int n) {
            int cur_sum = 0;
            int max_sum = INT_MIN;
            
            for (int i=0; i<n; i++) {
                cur_sum += A[i];
                if (cur_sum > max_sum) max_sum = cur_sum;
                if (cur_sum < 0) {
                    cur_sum = 0;
                }
            }
            return max_sum;
        }
    };

    老题

    第二轮:

    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.

    click to show more practice.

    More practice:

    If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

    理解就不用记了,更简洁一些的做法依照公式:f(n) = max(f(n-1) + A[0], A[0])

    class Solution {
    public:
        int maxSubArray(int A[], int n) {
            if (A == NULL || n < 1) {
                return INT_MIN;
            }
            int contsum = A[0];
            int maxsum = A[0];
            
            for (int i=1; i<n; i++) {
                contsum = max(contsum + A[i], A[i]);
                maxsum = max(maxsum, contsum);
            }
            return maxsum;
        }
    };

    分治法,nlogn, 但是TLE

    class Solution {
    public:
    int maxSubArray(int A[], int n) {
            return dfs(A, 0, n);
        }
        
        int dfs(int A[], int start, int end) {
            if (start >= end) {
                cout<<"range error: start="<<start<<", end="<<end<<endl;
                return INT_MIN;
            }
            if (start + 1 == end) return A[start];
            int mid = (start + end) / 2;
            int ma = dfs(A, start, mid);
            int mb = dfs(A, mid, end);
            int maxsum = ma > mb ? ma : mb;
            int lsum = 0, rsum = 0;
            int lmax = INT_MIN, rmax = INT_MIN;
            
            for (int i=mid - 1; i>=0; i--) {
                lsum += A[i];
                if (lsum > lmax) lmax = lsum;
            }
            
            for (int i=mid; i<end; i++) {
                rsum += A[i];
                if (rsum > rmax) rmax = rsum;
            }
            
            if (lmax + rmax > maxsum) maxsum = lmax + rmax;
            return maxsum;
        };
    };
  • 相关阅读:
    目前流行前端几大UI框架排行榜
    vue nginx配置
    快速切换npm源
    vue项目打包部署生产环境
    VScoed Vue settings.json配置
    java获取远程图片分辨率
    Fegin的使用总结
    线程池核心参数
    mysqldump定时任务生成备份文件内容为空解决方法
    对汉字编码
  • 原文地址:https://www.cnblogs.com/lailailai/p/3854124.html
Copyright © 2011-2022 走看看