返回连续子序列,使得和最大(变形)

编程珠玑上一道老题:一个数组,找出连续子序列使得和最大。我们可以使用线性扫描的算法来解决,这道题变形之后成为:找出连续子序列,使得和最接近某个数。原来的时间复杂度为线性的方法行不通了,我们可以累加数组,然后排序,求的相邻的差,最接近k的数就是所求。代码如下:
  1. int approximate(int * pArry, int len)  
  2. {  
  3.     int * cum = 0;  
  4.     int * realarry = new int[len + 1];  
  5.     realarry[0] = 0;    
  6.     cum = realarry + 1;  //cum[-1] = 0  
  7.   
  8.     //累计pArry[0....i]的和存放于cum[i]中  
  9.     for (int i = 0; i < len; i++)  
  10.     {  
  11.         cum[i] = cum[i - 1] + pArry[i];  
  12.     }  
  13.     sort(cum, cum + len); //对cum排序  
  14.     int iMin = cum[1] - cum[0];  
  15.     for (int k = 1; k < len; k++)  
  16.     {  
  17.         iMin = min(iMin, cum[k] - cum[k - 1]);  //返回相邻两个元素差值最小的  
  18.     }  
  19.     return iMin;  
  20. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值