LeetCode53、最大子序和(分治法动态规划)

题目描述

暴力法

class Solution {
    
    
    public int maxSubArray(int[] a) {
    
    

    int n = a.length;
    if(n==1){
    
    
        return a[0];
    }
    int max=Integer.MIN_VALUE,esti=0;
	for(int i=0;i<n;i++){
    
    //以a[i]开头的子段求和,取最大值 
		int sub= 0; 
		for(int j=i;j<n;j++){
    
    //a[i]~a[j]子段 
				sub+=a[j];
				if(sub>max){
    
    
					max = sub;
					
				}	
		}
    }
    return max;

    }
}

分治法

class Solution {
    
    
    public int maxSubArray(int[] a) {
    
    
        return MaxSubsum(a,0,a.length-1);
    }
   public int MaxSubsum(int []a,int left,int right){
    
    
	int sum;
	if(left==right)
		sum=a[left];
	else{
    
    
		//位于左边的一半|或者位于右边的一半 
		int center = (left+right)/2;
		int leftsum = MaxSubsum(a,left,center); 
		int rightsum = MaxSubsum(a,center+1,right);
		
		//位于中间部分
		//先求左边的最大值 
		int s1=0,lefts=Integer.MIN_VALUE;
		for(int i=center;i>=left;i--){
    
    
			s1+=a[i];
			if(lefts<s1){
    
    
				lefts = s1;
			}
		}
		//右边最大值 
		int s2=0,rights=Integer.MIN_VALUE;
		for(int i=center+1;i<=right;i++){
    
    
			s2+=a[i];
			if(rights<s2){
    
    
				rights = s2;
			}
		}
		//求三者中的最大值
		sum = rights+lefts;
		if(sum<leftsum) sum=leftsum;
		if(sum<rightsum) sum = rightsum; 
	}
	return sum;
} 
}

动态规划

class Solution {
    
    
    public int maxSubArray(int[] a) {
    
    
    int n = a.length;
    int []b = new int[n];
	b[0]=a[0];
    int max=b[0];
    for(int i=1; i<n; i++)
    {
    
    
        if(b[i-1]>0)
            b[i]=b[i-1]+a[i];
        else
            b[i]=a[i];
        if(b[i]>max)
            max=b[i];
    }
	return max;

    }

在这里插入图片描述
思路解析请参考我的博客:算法学习(三)动态规划(重要)

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/108566431