// Solution 1: class Solution { public: int maxSubArray(vector &nums){ //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值 // 或者不用初始化为理论的最小值 //int res = INT_MIN; int res = nums[0]; int n = nums.size(); for (int i=0;i& nums){ int res = nums[0]; int n = nums.size(); vector dp(n); dp[0] = nums[0]; for (int i=1;i& nums){ int res = nums[0]; int n = nums.size(); int sum = 0; for (int i=0;i0) { sum+=nums[i]; } else { sum = nums[i]; } res = max(res,sum); } return res; } }; // Solution 3: class Solution { public: int maxSubArray(vector &nums) { //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值 int res = nums[0]; int n = nums.size(); res = maxSubArrayHelper(nums, 0, n - 1); return res; } int maxSubArrayHelper(vector &nums, int left, int right) { if (left == right) { return nums[left]; } int mid = (left + right) / 2; int leftSum = maxSubArrayHelper(nums, left, mid); //注意这里应是mid + 1,否则left + 1 = right时,会无线循环 int rightSum = maxSubArrayHelper(nums, mid + 1, right); int midSum = findMaxCrossingSubarray(nums, left, mid, right); int res = max(leftSum, rightSum); res = max(res, midSum); return res; } int findMaxCrossingSubarray(vector &nums, int left, int mid, int right) { int leftSum = INT_MIN; int sum = 0; for (int i = mid; i >= left; i--) { sum += nums[i]; leftSum = max(leftSum, sum); } int rightSum = INT_MIN; sum = 0; //注意这里i = mid + 1,避免重复用到nums[i] for (int i = mid + 1; i <= right; i++) { sum += nums[i]; rightSum = max(rightSum, sum); } return (leftSum + rightSum); } }; /// C++ Solution 4: class Solution { public: int maxSubArray(vector nums) { int res = nums[0]; int n = nums.size(); int sum = 0; for (int i=0;i 0) sum+=nums[i]; else sum = nums[i]; res = max(res,sum); } return res; } };