算法思路和算法复杂度分析在函数中
public class leetcode_53 {
/**
* 最大子序列和
*
*
*/
public static void main(String[] args) {
//测试第一种思路:
int[] array = {-2,-1};
System.out.println(maxSubArray(array));
//测试第二种思路:
System.out.println(maxSubArray3(array));
}
public static int maxSubArray(int[] nums) {
/**
*
* 算法思路:maxNumber:全局最大值
* currentNumber : 当前最大值
* 如果 currentNumber <=0 将currentNumber= nums[i];
* 如果currentNumber> 0 将currentNumber += nums[i]
*/
/**
*
* 算法复杂度分析:O(n)
*
*
*/
int maxNumber = nums[0];
int currentNumber = nums[0];
int len = nums.length;
for(int i =1;i<len;i++) {
if(currentNumber >0) {
currentNumber += nums[i];
}else {
currentNumber = nums[i];
}
if(currentNumber > maxNumber) {
maxNumber = currentNumber;
}
}
return maxNumber;
}
public static int maxSubArray3(int[] nums) {
return maxSubArray2(nums, 0, nums.length-1);
}
public static int maxSubArray2(int[] nums,int start ,int end) {
/**
* 算法思路:可以通过分治法进行求解,
* leftmax:左边一半最大值
* rightmax : 右边一半最大值
* leftsum+rightsum : 最大值跨越middle
*
* leftmax,rightmax通过递归
* leftsum+rightsum通过O(N复杂度进行求解)
*
*/
/**
* 算法复杂度分析:递归表达式为T(N) = 2T(N/2) + O(N)
* 通过主定理,可以得出为case2,所以算法复杂度为O(NlgN)
*/
int leftmax,rightmax;
//int leftsum ,rightsum;
if(start == end) {
return nums[start];
}else if(start>end){
return Integer.MIN_VALUE;
}
int middle = (start+end)>>1;
leftmax = maxSubArray2(nums,start,middle);
rightmax = maxSubArray2(nums,middle+1,end);
int currentleftSum = 0;
int leftsum = Integer.MIN_VALUE;
for(int i = middle;i>=start;i--) {
currentleftSum += nums[i];
if(currentleftSum > leftsum) {
leftsum = currentleftSum;
}
}
int currentrightSum = 0;
int rightsum = Integer.MIN_VALUE;
for(int i = middle+1;i<=end;i++) {
currentrightSum += nums[i];
if(currentrightSum>rightsum) {
rightsum = currentrightSum;
}
}
return max3(leftmax,rightmax,leftsum+rightsum);
}
public static int max3(int x,int y,int z) {
int max = x>y?x:y;
return max>z?max:z;
}
}