java最大子序列和问题的求解

关于最大子序列和问题的求解在时间复杂度以及空间复杂度没有限制的情况下,针对于小样本数组的求解使用暴力穷尽法也是可以的,它的时间复杂度为O(n*N*n),代码如下所示:

public static int maxSub(int[] arr){
		int n = arr.length;
		int maxSum = 0; //Integer.MIN_VALUE;
		for(int i=0; i<n; i++){
			for(int j=i; j<n; j++){
				int tempSum = 0;
				for(int k=i; k<=j; k++){
					tempSum += arr[k];					
				}
				if(tempSum > maxSum){
					maxSum = tempSum;
				}	
			}
		}
		return maxSum;
	}
上面的算法在计算的过程多次重复计算,是的时间复杂度比较高,现在我们针队上述的算法进行优化,去掉计算过程中重复的部分,时间复杂度可以降到O(n*n),实现的代码如下所示:

public static int maxSubOpt(int[] arr){
		int n = arr.length;
		int maxSum = Integer.MIN_VALUE;
		for(int i=0; i<n; i++){
			int tempSum = 0;
			for(int j=i; j<n; j++){
				tempSum += arr[j];
				if(tempSum > maxSum){
					maxSum = tempSum;
				}
			}
		}
		return maxSum;

关于该问题比较好的解法是使用动态规划的方法可以讲时间复杂度降到O(n)的线性时间复杂度。(本文未给出,可以参考: 点击打开链接),下面给出本文所使用的代码:

public class MaxSubSequentTest1 {
	public static int maxSub(int[] arr){
		int n = arr.length;
		int maxSum = 0; //Integer.MIN_VALUE;
		for(int i=0; i<n; i++){
			for(int j=i; j<n; j++){
				int tempSum = 0;
				for(int k=i; k<=j; k++){
					tempSum += arr[k];					
				}
				if(tempSum > maxSum){
					maxSum = tempSum;
				}	
			}
		}
		return maxSum;
	}
	
	public static int maxSubOpt(int[] arr){
		int n = arr.length;
		int maxSum = Integer.MIN_VALUE;
		for(int i=0; i<n; i++){
			int tempSum = 0;
			for(int j=i; j<n; j++){
				tempSum += arr[j];
				if(tempSum > maxSum){
					maxSum = tempSum;
				}
			}
		}
		return maxSum;
	}
	
	public static void main(String[] args){
		long startTime = System.currentTimeMillis();
		int[] arr = new int[]{2,-3,5,6,-2,-8,9,6,2,-7};
		int max = maxSub(arr);
		long endTime = System.currentTimeMillis();
		System.out.println(endTime - startTime);
		System.out.println(max);
	}

}



已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页