最大子序列的算法实现

 

最大子序列的算法实现

  1. import java.util.Arrays;  
  2.   
  3. /** 
  4.  * 最大子序列的算法实现。<br> 
  5.  * 最大子序列,就是一段数字数列中,总和最大的一段。 
  6.  *  
  7.  * @author 赵学庆,Java世纪网(java2000.net) 
  8.  *  
  9.  */  
  10. public class T {  
  11.   
  12.   int[] a = { -211, -413, -52, -5, -312, -9 };  
  13.   
  14.   public static void main(String[] args) {  
  15.     T t = new T();  
  16.     System.out.println(Arrays.toString(t.max_sub(t.a, t.a.length)));  
  17.     System.out.println(Arrays.toString(t.max_sub2(t.a, t.a.length)));  
  18.   }  
  19.   
  20.   /** 
  21.    * 方法1,二次扫表整个表 
  22.    *  
  23.    * @param a 
  24.    * @param size 
  25.    * @return 
  26.    */  
  27.   int[] max_sub(int a[], int size) {  
  28.     int i, j, v;  
  29.     int[] rtn = new int[3];  
  30.     rtn[0] = a[0];  
  31.     for (i = 0; i < size; i++) {  
  32.       v = 0;  
  33.       for (j = i; j < size; j++) {  
  34.         v += a[j]; // Sum(i, j+1) = Sum(i, j) + A[j+1]  
  35.         if (v > rtn[0]) {  
  36.           rtn[0] = v;  
  37.           rtn[1] = i;  
  38.           rtn[2] = j;  
  39.         }  
  40.       }  
  41.     }  
  42.     return rtn;  
  43.   }  
  44.   
  45.   /** 
  46.    * 方法2.一次扫表一个表。<br> 
  47.    * 如果一段序列的和大于0,则记录其最大值。<br> 
  48.    * 如果小于0,则从下一个数字重新开始统计。 
  49.    *  
  50.    * @param a 
  51.    * @param size 
  52.    * @return 
  53.    */  
  54.   int[] max_sub2(int a[], int size) {  
  55.     int[] rtn = new int[3];  
  56.     rtn[0] = 0;  
  57.     rtn[1] = 0;  
  58.     int i, temp_sum = 0;  
  59.     for (i = 0; i < size; i++) {  
  60.       temp_sum += a[i];  
  61.       if (temp_sum > rtn[0]) {  
  62.         rtn[0] = temp_sum;  
  63.         rtn[2] = i;  
  64.       } else if (temp_sum < 0) {  
  65.         temp_sum = 0;  
  66.         rtn[1] = i + 1// 下一个位置才是开始  
  67.       }  
  68.     }  
  69.     return rtn;  
  70.   }  
  71.   
  72. }  


运行结果:
[21, 1, 8]
[21, 1, 8]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值