zoukankan      html  css  js  c++  java
  • 求最大子列和

    package MaxSubseqSum;
    
    public class MaxSubseqSumDemo {
    	// 使用三个嵌套循环计算最大子列和,时间复杂度为 O(n^3)
    	public int getMaxSubseqSum1(int[] a, int n) {
    		int i, j, k, ThisSum, MaxSum = 0;
    		for (i = 0; i < n; i++) {
    			for (j = i; j < n; j++) {
    				ThisSum = 0;
    				for (k = i; k <= j; k++) {
    					ThisSum += a[k];
    				}
    				if (ThisSum > MaxSum) {
    					MaxSum = ThisSum;
    				}
    			}
    		}
    		return MaxSum;
    	}
    
    	// 使用二个嵌套循环计算最大子列和 时间复杂度为 O(n^2)
    	public int getMaxSubseqSum2(int[] a, int n) {
    		int i, j, ThisSum, MaxSum = 0;
    		for (i = 0; i < n; i++) {
    			ThisSum = 0;
    			for (j = i; j < n; j++) {
    				ThisSum += a[j];
    				if (ThisSum < 0) {
    					ThisSum = 0;
    				}
    				if (ThisSum > MaxSum) {
    					MaxSum = ThisSum;
    				}
    			}
    		}
    		return MaxSum;
    	}
    
    	// 使用分治法实现计算最大子类和的问题,时间复杂度为 O(nlg(n))
    	// 使用递归来实现分治
    	public int getMax(int maxMidSum, int maxLeftSum, int maxRightSum) {
    		int max;
    		if (maxMidSum > maxLeftSum) {
    			max = maxMidSum;
    		} else {
    			max = maxLeftSum;
    		}
    		if (max < maxRightSum) {
    			max = maxRightSum;
    		}
    		return max;
    	}
    
    	public int getMaxSubseqSum3(int[] a, int left, int right) {
    		// 设置推出条件,如果<0返回0
    		if (left == right) {
    			if (a[left] > 0) {
    				return left;
    			} else {
    				return 0;
    			}
    		}
    
    		// 递归左右两边需要分治的部分得到两边的最大最小值
    		int center = (left + right) / 2;
    		int maxLeftSum = getMaxSubseqSum3(a, left, center);
    		int maxRightSum = getMaxSubseqSum3(a, center + 1, right);
    
    		// 对于跨国中间部分的最值需要对本层递归进行特殊处理
    		int maxLeftBorderSum = 0;
    		int leftBorderSum = 0;
    
    		for (int i = center; i >= left; i--) {
    			leftBorderSum += a[i];
    			if (leftBorderSum > maxLeftBorderSum) {
    				maxLeftBorderSum = leftBorderSum;
    			}
    		}
    
    		int maxRightBorderSum = 0;
    		int rightBorderSum = 0;
    		for (int i = center + 1; i <= right; i++) {
    			rightBorderSum += a[i];
    			if (rightBorderSum > maxRightBorderSum) {
    				maxRightBorderSum = rightBorderSum;
    			}
    		}
    		return getMax(maxLeftBorderSum + maxRightBorderSum, maxLeftSum,
    				maxRightSum);
    	}
    
    	// 使用在线处理的方法计算最大子列和问题,时间复杂度为O(n),目前时间复杂度最好的算法了
    	public int getMaxSubseqSum4(int[] a, int n) {
    		int thisSum = 0;
    		int maxSum = 0;
    		for (int i = 0; i < n; i++) {
    			thisSum += a[i];
    			if (thisSum > maxSum) {
    				maxSum = thisSum;
    			}
    			if (thisSum < 0) {
    				thisSum = 0;
    			}
    		}
    		return maxSum;
    	}
    }
    

    package MaxSubseqSum;
    
    public class MaxSubseqSumTest {
    	public static void main(String[] args) {
    		int[] a = { 1, 2, 3, -6, 5, 2, 1 };
    		MaxSubseqSumDemo Max = new MaxSubseqSumDemo();
    		int max1 = Max.getMaxSubseqSum1(a, a.length);
    		int max2 = Max.getMaxSubseqSum2(a, a.length);
    		int max3 = Max.getMaxSubseqSum3(a, 0, a.length - 1);
    		int max4 = Max.getMaxSubseqSum4(a, a.length);
    		System.out.println(max1);
    		System.out.println(max2);
    		System.out.println(max3);
    		System.out.println(max4);
    	}
    }

  • 相关阅读:
    swift 设置图片动画组 iOS11之前 默认图片 设置不成功
    iOS 管理库 Carthage 安装以及使用
    OC 和 swift 冒泡排序
    swift中UITextView的使用
    图片拉伸
    swift
    label文字从左上角开始
    2017最新总结CocoaPods安装细节及遇到的问题
    苹果 重置APPID密保问题及更新开发者协议
    xcode
  • 原文地址:https://www.cnblogs.com/wei1/p/9582126.html
Copyright © 2011-2022 走看看