zoukankan      html  css  js  c++  java
  • 【LeetCode】053. 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.

    题解:

      遍历所有组合,更新最大和。

    Solution 1 (TLE)

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

      可以看做动态规划的简略版,见Solution 5

    Solution 2 ()

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

      贪心算法:The idea is to find the largest difference between the sums when you summing up the array from left to right. The largest difference corresponds to the sub-array with largest sum

    Solution 3 ()

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            int sum = 0, minsum = 0, result = nums[0], n = nums.size();
            for(int i = 0; i < n; i++) {
                sum += nums[i];
                if(sum - minsum > res) result = sum - minsum;
                if(sum < minsum) minsum = sum;
            }
            return result;
        }
    };

      分治法:

    Solution 4 ()

      DP算法:维护一个一维数组。

    Solution 5 ()

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            int n = nums.size();
            vector<int> dp(n,0);//dp[i] means the maximum subarray ending with nums[i];
            dp[0] = nums[0];
            int max = dp[0];
            
            for(int i = 1; i < n; i++){
                dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
                max = Math.max(max, dp[i]);
            }        
            return max;
        }
    };
  • 相关阅读:
    事件冒泡
    jquery validation验证身份证号、护照、电话号码、email
    移动平台对 meta 标签的定义
    css3属性笔记
    渐变的参数
    各浏览器前缀
    Ubuntu20.04安装Matlab2018b
    win7 php安装使用
    mysql输入命令后没响应
    CentOS7上搭建Dokuwiki
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6730921.html
Copyright © 2011-2022 走看看