53. 最大子数组和
53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
解:dp/贪心算法
顺序遍历,用一变量sum记录当前子数组和,另一变量res记录最大子数组和。
下标每后移一位更新res,若sum<0后续子数组和必定更小,此时便把sum重置。
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if(nums.size() == 1) 5 return nums.at(0); 6 int res = INT_MIN; 7 int sum = nums.at(0); 8 for(int i = 1;i < nums.size();++i) 9 { 10 res = res > sum?res:sum; 11 sum = sum > 0?sum+nums.at(i):nums.at(i); 12 } 13 res = res > sum?res:sum; 14 return res; 15 } 16 };
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 int result = INT32_MIN; 5 int count = 0; 6 for (int i = 0; i < nums.size(); i++) { 7 count += nums[i]; 8 if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置) 9 result = count; 10 } 11 if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和 12 } 13 return result; 14 } 15 };
//dp原始版
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if (nums.size() == 0) return 0; 5 vector<int> dp(nums.size(), 0); // dp[i]表示包括i之前的最大连续子序列和 6 dp[0] = nums[0]; 7 int result = dp[0]; 8 for (int i = 1; i < nums.size(); i++) { 9 dp[i] = max(dp[i - 1] + nums[i], nums[i]); // 状态转移公式 10 if (dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值 11 } 12 return result; 13 } 14 };
//dp优化版
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if (nums.size() == 0) return 0; 5 int pre,cur=0; // dp[i]表示包括i之前的最大连续子序列和 6 pre = nums[0]; 7 int result = pre; 8 for (int i = 1; i < nums.size(); ++i) { 9 cur = max(pre + nums[i], nums[i]); // 状态转移公式 10 if (cur > result) result = cur; // result 保存dp[i]的最大值 11 pre = cur; 12 } 13 return result; 14 } 15 };
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号