从最大公共子序列的和的问题上去分析程序所花费的时间

本文探讨了四种解决最大公共子序列和问题的算法,分别具有O(N^3)、O(N^2)、O(N*LogN)和O(N)的复杂度。通过递归和不同策略,展示了算法效率的提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种:相对的复杂度为O(N^3)

     //O(N^3)
	public static int MaxSubsequenceSum1(int arr[]){
		int sum=0;
		int maxSum=Integer.MIN_VALUE;
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr.length;j++){
			      sum=0;
			     for(int k=i;k<=j;k++){
			    	 sum+=arr[k];
			    	 if(sum>maxSum){
			    		 maxSum=sum;
			    	 }
			     }
			}
		}
		return maxSum;
	}

第二种:相对的复杂度为O(N^2)

//O(N^2)
    public static int MaxSubsequenceSum2(int arr[]){
    	int sum=0;
		int maxSum=Integer.MIN_VALUE;
		for(int i=0;i<arr.length;i++){
			    sum=0;
			for(int j=i;j<arr.length;j++){
			    sum+=arr[j];
			    if(sum>maxSum){
			    	maxSum=sum;
			    }
			}
		}
		return maxSum;
	}

第三种:相对的复杂度为O(N*LogN)----->使用递归

                              根据Master公式可得

    public static void MaxSubsequenceSum3(int[] arr){
    	if(arr==null||arr.length<1){
    		return;
    	}
    	int right=arr.length-1;
    	System.out.println(maxValue(arr,0,right));
    }
    public static int maxValue(int[] arr,int left,int right){
    	 if(left==right){
    		 if(arr[left]>0){
    			 return arr[left];
    		 }else{
    			 return 0;
    		 }
    	 }
    	int mid=(left+right)>>1;
        int maxLeft=maxValue(arr,left,mid); 
        int maxRight=maxValue(arr,mid+1,right);
        int maxMid=Max_Sum(arr,left,right);
        return Math.max(Math.max(maxLeft, maxRight),maxMid);
    }
    public static int Max_Sum(int[] arr,int left,int right){
    	  int max=0;
    	  int thissum=arr[left]<0?(-1)*arr[left]:0;
    	  for(int i=left;i<right;i++){
    		  thissum+=arr[i];
    		  if(thissum>max){
    			  max=thissum;
    		  }
    	  }
    	  return max;
    }

第四种:相对的复杂度为O(N)

//O(N)
    public static int MaxSubsequenceSum4(int arr[]){
    	int sum=arr[0]<0?arr[0]*(-1):0;
		int maxSum=Integer.MIN_VALUE;
		for(int i=0;i<arr.length;i++){
			 sum+=arr[i];
			 if(sum>maxSum){
				 maxSum=sum;
			 }else if(sum<0){
				sum=0;
			 }
		}
		return maxSum;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值