• 【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;
        }
    };
  • 相关阅读:
    3.STM32复位系统
    3.CM3内核架构-寄存器
    2.STM32启动文件
    java线程池
    java多线程
    动态规划(dynamic programming)(二、最优子问题与重叠子问题,以及与贪心的区别)
    SOAP协议
    动态规划(dynamic programming)(一、简介,举例)
    红黑树-RBT(二、基本操作之插入)
    红黑树-RBT(二、基本操作之左旋)
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6730921.html
Copyright © 2020-2023  润新知