@@ -38,7 +38,7 @@ public int maxSubArray(int[] nums) {
38
38
/**
39
39
* https://leetcode.com/problems/maximum-subarray/discuss/20210/O(n)-Java-solution
40
40
*/
41
- public int maxSubArray (int [] A ) {
41
+ public int maxSubArray2 (int [] A ) {
42
42
int max = Integer .MIN_VALUE , sum = 0 ;
43
43
for (int i = 0 ; i < A .length ; i ++) {
44
44
if (sum < 0 )
@@ -52,6 +52,34 @@ public int maxSubArray(int[] A) {
52
52
}
53
53
54
54
55
+ // divide-and-conquer
56
+ public int maxSubArray3 (int [] nums ) {
57
+ if (nums == null || nums .length == 0 ) return 0 ;
58
+ return maxSubArray (nums , 0 , nums .length -1 );
59
+ }
60
+
61
+ private int maxSubArray (int [] nums , int left , int right ) {
62
+ if (left > right ) return Integer .MIN_VALUE ;
63
+ if (left == right ) return nums [left ];
64
+ int mid = (left + right ) / 2 ;
65
+ int L = maxSubArray (nums , left , mid -1 );
66
+ int R = maxSubArray (nums , mid +1 , right );
67
+ int leftSum = 0 ;
68
+ int tmp = 0 ;
69
+ for (int i =mid -1 ; i >=left ; i --) {
70
+ tmp += nums [i ];
71
+ if (tmp > leftSum ) leftSum = tmp ;
72
+ }
73
+ tmp = 0 ;
74
+ int rightSum = 0 ;
75
+ for (int i =mid +1 ; i <=right ; i ++) {
76
+ tmp += nums [i ];
77
+ if (tmp > rightSum ) rightSum = tmp ;
78
+ }
79
+ return Math .max (Math .max (L , R ), leftSum + rightSum + nums [mid ]);
80
+ }
81
+
82
+
55
83
public static void main (String [] args ) {
56
84
MaximumSubarray53 ms = new MaximumSubarray53 ();
57
85
0 commit comments