• 【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;
        }
    };
  • 相关阅读:
    消息队列中间件的技术选型分析
    数据库和缓存一致性的问题
    《RocketMQ 安装和使用》
    RocketMQ原理讲解系列文章
    阿里巴巴开源项目
    RocketMQ与Kafka对比(18项差异)
    对象初始化
    pytest_05_fixture之conftest.py
    pytest_04_测试用例setup和teardown
    Python与MogoDB交互
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6730921.html
Copyright © 2020-2023  润新知