(一)绪论

/*【问题描述】给定一整数序列A1, A2,... An (可能有负数),
 * 求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。例如:
 * 整数序列 -2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21(从A2到A9)
 * ;整数序列4,-3,5,-2,1,2,6,-2的最大子序列的和为11(从A1到A7)*/
package maxSubSequence;

public class maxSubSequenceSolutions {
 public static int maxSubSequenceSolution1(int[] sequence) {
  int sum = 0;
  int max = 0;
  for (int i = 1; i <= sequence.length; i++) {
   for (int j = 0; j < sequence.length; j++) {
    sum = 0;
    for (int k = j; k < j + i && k < sequence.length; k++) {
     sum += sequence[k];
     if (sum > max) {
      max = sum;
     }
    }
   }
  }
  return max;
 }// solution1 ends (get all sum of the subsequence) O(n^3)
 
 
 public static int maxSubSequenceSolution2(int[] sequence) {
  int sum = 0;
  int max = 0;
  for (int i = 0; i < sequence.length; i++) {
   for (int j = i; j < sequence.length; j++) {
    sum += sequence[j];
    if (sum > max) {
     max = sum;
    }
   }
  }
  return max;
 }// solution2 ends (利用递推公式减少一重循环){sum(i,j+1)=sum(i,j)+sequence[j+1]} O(n^2)
 
 
 
 
 public static int maxSub3(int[] sequence, int left, int right) {
  if (left == right) {
   if (sequence[left] > 0) {
    return sequence[left];
   } else {
    return 0;
   }
  }
  int mid = (left + right) / 2;
  int maxLeftSum = maxSub3(sequence, left, mid);
  int maxRightSum = maxSub3(sequence, right, mid);
  int maxLeftBorderSum = 0, leftBorderSum = 0;
  for (int i = mid; i >= left; i--) {
   leftBorderSum += sequence[i];
   if (leftBorderSum > maxLeftBorderSum) {
    maxLeftBorderSum = leftBorderSum;
   }
  }
  int maxRightBorderSum = 0, rightBorderSum = 0;
  for (int i = mid; i <= right; i++) {
   rightBorderSum += sequence[i];
   if (rightBorderSum > maxRightBorderSum) {
    maxRightBorderSum = rightBorderSum;
   }
  }
  return max(maxRightBorderSum + maxLeftBorderSum, maxLeftSum, maxRightSum);
 }
 public static int max(int a, int b, int c) {
  int max = a > b ? a : b;
  max = max > c ? max : c;
  return max;
 }
 public static int maxSubSequenceSolution3(int[] sequence) {
  return maxSub3(sequence, 0, sequence.length - 1);
 }//Solution3 ends (递归)                                    O(n*log(n))
 
 
 
 
 public static int maxSubSequenceSolution4(int[] sequence) {
  int max = 0;
  int sum =0;
  for (int i=0;i<sequence.length;i++) {
   sum+=sequence[i];
   if (sum>max)
    max =sum;
   if(sum<0)
    sum =0;
  }
  return max;
 }//Solution4 ends (动态规划)           O (n)
 
 
 
 public static void main(String[] args) {
  // TODO Auto-generated method stub
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值