最大子数组和 class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(); vector<int> dp(n, 0); dp[0] = nums[0]; int res = dp[0]; for (int i = 1; i < n; i++) { dp[i] = max(nums[i], dp[i - 1] + nums[i]); res = max(res, dp[i]); } return res; } }; 环形子数组的最大和 class Solution { public: int maxSubarraySumCircular(vector<int>& nums) { int n = nums.size(); vector<int> f(n, 0), g(n, 0); f[0] = nums[0]; g[0] = nums[0]; long long sum = nums[0]; int mn = nums[0], ma = nums[0]; for(int i = 1; i < n; i++) { f[i] = max(nums[i], f[i - 1] + nums[i]); g[i] = min(nums[i], g[i - 1] + nums[i]); ma = max(ma, f[i]); mn = min(mn, g[i]); sum += nums[i]; } if(sum == mn) return ma; // 全为负数 return max(ma,(int)(sum - mn)); } };