憧憬,思考,奋斗,飞翔

一、题目描述

给定一个整型数组,找出最大下标距离

二、直观方案(时间复杂度为O(n^2))

对每个元素,从其后找出比其大的元素,并计算下标距离,取距离中的最大值即可。该

方案的时间复杂度为O(n^2)。那么能不能优化下呢?

三、优化方案(时间复杂度为O(n))

存在这样一个事实,当

基于以上的事实,我们只要从数组的第一个元素开始,找一个下降的序列,从尾部开始扫描,求出最大下标距离。

例如,数组

第一步,,

第二步,

第三步,

第四步,

第五步,

第六步,

第七步,

第八步,

第九步,i=-1,结束;

代码实现如下:

//返回数组中最大下标距离j-i,当且仅当nArray[i]<nArray[j],j>iint MaxSubDistance( int nArray[], int nCount ){//查找一个下降序列bool* bDescSeq = new bool[nCount];memset( bDescSeq, 0, sizeof(bool)*nCount );int nMinNum = nArray[0];for ( int i = 1; i < nCount; ++i ){if ( nArray[i] < nMinNum ){bDescSeq[i] = true;nMinNum = nArray[i];}}int nMaxSubDistance = 0;int i = nCount – 1;int j = nCount – 1;while( i >= 0 ){if( !bDescSeq[i] ){–i;continue;}while( j > i && nArray[i] >= nArray[j] )–j;if ( (j – i) > nMaxSubDistance ){nMaxSubDistance = j – i;//j = nCount – 1;//这句多余,这句加上的话,时间复杂度则为O(n^2)了。}–i;}if ( NULL != bDescSeq ){delete[] bDescSeq;bDescSeq = NULL;}return nMaxSubDistance;}

系列文章说明:1.本系列文章[算法练习],仅仅是本人学习过程的一个记录以及自我激励,没有什么说教的意思。如果能给读者带来些许知识及感悟,那是我的荣幸。2.本系列文章是本人学习陈东锋老师《进军硅谷,程序员面试揭秘》一书而写的一些心得体会,文章大多数观点均来自此书,特此说明!3.文章之中,难免有诸多的错误与不足,欢迎读者批评指正,谢谢.

作者:山丘儿

出门走好路,出口说好话,出手做好事。

憧憬,思考,奋斗,飞翔

相关文章:

你感兴趣的文章:

标签云: