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;
        }
    };
  • 相关阅读:
    linux下启动和关闭网卡命令及DHCP上网
    python 编码问题
    paddlepaddle
    Convolutional Neural Network Architectures for Matching Natural Language Sentences
    deep learning RNN
    Learning Structured Representation for Text Classification via Reinforcement Learning 学习笔记
    Python IO密集型任务、计算密集型任务,以及多线程、多进程
    EM 算法最好的解释
    tensorflow 调参过程
    tensorflow 学习纪录(持续更新)
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6730921.html
Copyright © 2011-2022 走看看