求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好
来源:互联网 发布:征信大数据是什么意思 编辑:程序博客网 时间:2024/05/15 23:52
求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好。
1、问题分析:
如果没有时间现在,那么直接使用两层for循环,就能搞定问题。其代码大致如下:
Code::
int find_max_diff_slow(int *array,int len)
{
int i=len-1,j=0,ret=0,diff=0;
if(len==2)return array[1]-array[0];
if(len<=1)return -1;
ret=array[len-1]-array[len-2];
for(i=len-1;i>0;i--)
{
for(j=i-1;j>0;j--)
{
diff=array[i]-array[j];
if(ret<diff)ret=diff;
}
}
return ret;
}
采用find_max_diff_slow的时间复杂度为O(n^2)
那么有没有更快的方法呢?有!
http://topic.csdn.net/u/20070917/19/de6931d2-18a4-4f0e-ac83-89f9e597c32d_3.html
方法来自上面这个链接。这个链接主题讨论了数组两两之差的绝对值最小的求解问题,和本文中的问题有些出入,不过思想都是一样的,即转换!那么如何转换呢?
2、另一问题
在进一步讨论问题转换前,先看看另外一个问题:
求n个浮点数向量的连续的任何子向量的最大和。
例如[31,-41,59,26,-53,58,97,-93,-23,84],最大和为:59+26-53+59+97=187
根据《编程珠玑》中的介绍,这个问题可以在O(n)的条件下得到解答。
Code::
int max_sum_of_subarray(int *array,int len)
{
int i=0,maxendinghere=0,maxsofar=0;
for(i=0;i<len;++i)
{
maxendinghere=(maxendinghere+array[i])>0?maxendinghere+array[i]:0;
maxsofar=(maxendinghere>maxsofar)?maxendinghere:maxsofar;
}
return maxsofar;
}
3、问题的转换
现在我们看看如何求解这个问题。
对于数组A={A1,A2,A3,….,An},构造数组B,使得对于任意的Bi(i=1,2,3,…,n-1)满足如下条件:
Bi=An-i-1-An-i
即:
B1=An-An-1;
B2=An-1-An-2;
。。。。。。。。。
Bn-1=A2-A1;
对于任意的Aj-Ai(j>i)有如下公式成立:
Aj-Ai=Aj-Aj-1+Aj-1-Aj-2+…+Ai+2-Ai+1+Ai+1-Ai=Bk+Bk+1+…+Bp
其中k=n-j+1,p=n-i+1;
所以问题就转换为求数组B的连续子向量的最大和问题了,这个正式【2】中的正解!
4、代码和结果
int find_max_diff(int *array,int len)
{
int *diff_array=new int[len-1];
int i=0,j=0;
for(i=len-1,j=0;i>0;i--,j++)
{
diff_array[j]=array[i]-array[i-1];
}
int ret=max_sum_of_subarray(diff_array,len-1);
delete []diff_array;
return ret;
}
void test_max_sum_of_subarray()
{
int array[]={31,-41,59,26,-53,58,97,-93,-23,84};
cout<<"max_sub_sum::"<<max_sum_of_subarray(array,10)<<endl;
int array1[]={7,8,4,6,3,9};
cout<<find_max_diff(array1,6)<<endl;
cout<<find_max_diff_slow(array1,6)<<endl;
}
- 求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好
- 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间和空间复杂度尽可能小
- 给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得i<j,ai>aj,n高达10的6次方
- 2-11 整数数组 A1<A2<A3......An中是否存在 Ai = i?
- 最大子序列问题:给定一整数序列A1,A2,A3...An(可能有负数),求A1~An的一个最大子序列Ai~Aj的和。
- 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
- 给出一个有效的算法来确定在整数A1<A2<A3<...<AN的数组中是否存在整数i使得Ai=i
- 给一个数组,求a[i]<a[j]的情况下,j-i的最大值是多少,要求用O(n)时间复杂度
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- 求序列中满足Ai < Aj > Ak and i < j < k的组数 树状数组 HIT 2275 Number sequence
- 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn )
- 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn )
- 数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn )
- 设双链表表示的线性表L=(a1,a2,a3.....an)将L改造为L=(a1,a3,....an...a4,a2)
- 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列,对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽量高效
- 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- 求一个数组(a(i,j))中元素相减的最大值,且i<=j
- Android中的【Cursor】类总结
- VB 解决在循环中界面不更新
- zend配置SVN
- C#调用存储过程简单完整例子
- ASP.NET GirdView实现折叠式效果
- 求浮点数数组A={A1,A2,A3,…,An}中,Aj-Ai(j>i)的最大值。要求时间复杂度越小越好
- js实现div拖动
- Android ANR
- CentOS 5 上安装git
- Solaris磁阵挂载
- vb、asp和html中调用c#类库生成的dll文件所遇问题解决方案
- 分布式版本控制系统 Git
- Eclipse配色插件---Eclipse Color Theme,支持多种颜色配置
- Extending Adobe AIR