classSolution{ // T:O(n^2) S:O(1) publicintmaxSubArray(int[] nums){ if (nums == null || nums.length == 0) return0; int max = nums[0]; for (int i = 0; i < nums.length; i++) { int cur = 0; for (int j = i; j < nums.length; j++) { cur += nums[j]; max = Math.max(max, cur); } } return max; } }
在线处理法
在线处理意味着在每次循环过程中都计算出一个当前最终值。遍历过程中维护一个 cur 用来表示当前的值左边的最大非负数的和。如果 cur 小于 0 意味着舍弃掉,反之就带上。在加上了当前值之后,由于当前值的正负,所以还需要维护一个 max 用来找到最大值。
1 2 3 4 5 6 7 8 9 10 11
classSolution{ // T:O(n) S:O(1) publicintmaxSubArray(int[] nums){ int cur = 0, max = Integer.MIN_VALUE; for (int i = 0; i < nums.length; i++) { cur = cur <= 0 ? nums[i] : (cur + nums[i]); max = Math.max(max, cur); } return max; } }