// 时间复杂度:O(n^2) 无法通过 classSolution{ publicintmaxSubArray(int[] nums){ int max = Integer.MIN_VALUE; for(int i = 0;i < nums.length;i++){ int sum = 0; for(int j = i;j < nums.length;j++){ //sum(i,j)=sum(i,j-1)+nums[j] sum += nums[j]; if(sum > max) max = sum; } } return max; } }
// 前缀和 时O(n)空O(1) classSolution{ publicintmaxSubArray(int[] nums){ int min = 0; int ans = Integer.MIN_VALUE; int num = 0; for(int i = 0 ; i < nums.length ; i++){ num += nums[i]; ans = Math.max(ans , num - min); if(num<min){ min = num; } } return ans; } }
// 动态规划 时O(n)空O(n) classSolution{ publicintmaxSubArray(int[] nums){ int len = nums.length; if(len == 0) return0; //dp[i]:指以nums[i]结尾的最大连续子数组和 int[] dp = newint[len]; dp[0] = nums[0]; int res = nums[0]; for(int i = 1; i < len; i++){ dp[i] = Math.max(dp[i-1] + nums[i], nums[i]); res = Math.max(dp[i], res); } return res; } }
// 滚动数组优化 时O(n)空O(1) classSolution{ publicintmaxSubArray(int[] nums){ int len = nums.length; int max = nums[0], ans = max; for(int i = 1; i < len; i++){ max = Math.max(max + nums[i], nums[i]); ans = Math.max(max, ans); } return ans; } }