Find the contiguous subarray within an array (containing at least one number) which have the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4] ,
The contiguous Subarray has the [4,−1,2,1] largest sum = 6 .
Idea one: The idea of dynamic planning. Time complexity O (n), Spatial complexity O (1). The code of question 31, which is not only a good space-time complexity, but also a better handling of invalid input.
If the argument is a null pointer, the array length is less than 0. This returns 0. For the maximum value of the area molecule array is 0 and invalid input for both of the different requests. Sets a global variable to mark whether the input is invalid.
1 BOOLG_invalidinput =false;2 3 intFindgreatestsumofsubarray (int*pdata,intnlength) {4 if((PData = = NULL) | | (Nlength <=0))5 {6G_invalidinput =true;7 return 0;8 }9 TenG_invalidinput =false; One A intNcursum =0; - intNgreatestsum =0x80000000; - for(inti =0; i < nlength; ++i) the { - if(Ncursum <=0) -Ncursum =Pdata[i]; - Else +Ncursum + =Pdata[i]; - + if(Ncursum >ngreatestsum) ANgreatestsum =ncursum; at } - - returnngreatestsum; -}
Idea two: Divide and conquer the strategy. Time complexity O (NLGN), Spatial complexity O (1).
1 classSolution {2 Public:3 intMaxsubarray (intA[],intN) {4 returnMaxsubarray (A,0N1);5 }6 7 intMaxsubarray (intA[],intLowintHigh ) {8 if(Low = = high)returnA[low];9 Ten intMid = (low + high)/2; One intMax_left_sum =Maxsubarray (A, Low, mid); A intMax_right_sum = Maxsubarray (A, Mid +1, high); - - intMax_cross_leftsum = int_min, cross_leftsum =0; the for(inti = mid; I >= low; --i) { -Cross_leftsum + =A[i]; - if(Cross_leftsum >max_cross_leftsum) -Max_cross_leftsum =cross_leftsum; + } - + intMax_cross_rightsum = int_min, cross_rightsum =0; A for(inti = mid +1; I <= high; ++i) { atCross_rightsum + =A[i]; - if(Cross_rightsum >max_cross_rightsum) -Max_cross_rightsum =cross_rightsum; - } - - intMax_cross_sum = Max_cross_leftsum +max_cross_rightsum; in - if(Max_left_sum >= max_cross_sum && max_left_sum >=max_right_sum) { to returnmax_left_sum; +}Else if(Max_right_sum >= max_cross_sum && max_right_sum >=max_left_sum) { - returnmax_right_sum; the}Else { * returnmax_cross_sum; $ }Panax Notoginseng } -};
[Leetcode] Maximum Subarray