找數(shù)組的i,j(j>i)使得a[j] - a[i]的值最大(算法)

第一種方法:

用兩重循環(huán)對(duì)每對(duì)點(diǎn)都試一下颜屠,然后取最大值即可,時(shí)間復(fù)雜度為O(n2)

#include?

#include

usingnamespacestd;

intmaxIndexDiff(inta[],intn)

{

intmaxDiff = -1;

for(inti =0; i <? n; ++i)

{

for(intj =n-1; j > i ; --j)

{

if(a[j]>a[i]) maxDiff = max(maxDiff,j-i);

}

}returnmaxDiff;

}

int

main()

{

inta[]={9,2,3,4,5,6,7,8,18,0};

intn =sizeof(a)/sizeof(a[0]);

intmaxDiff =maxIndexDiff(a,n);

cout<

}

第二種方法:

首先對(duì)數(shù)組按照高度排序從小到大排序更啄,如果高度相等的話纳令,按照索引從小到大排序柠贤。

此時(shí)只需要在右邊找一個(gè)索引值j帮孔,在左邊找一個(gè)索引值i雷滋,使j-i最大即可。

可以建立一個(gè)rightMax數(shù)組,記錄下每個(gè)索引右邊的最大值晤斩,注意從右邊往左邊掃描焕檬,計(jì)算右邊最大值簡(jiǎn)單些。

然后將當(dāng)前的rightMax與排序后原始索引作差取最大值即可澳泵。時(shí)間復(fù)雜度O(nlogn)

#include #include#includeusingnamespacestd;structnode{intindex;intheight;

node(intidx =0,inth =0):index(idx),height(h){}booloperator<(constnode& a)const{if(height!=a.height)returnheight

}

};intmaxIndexDiff(inta[],intn){

vectorb(n);for(inti =0; i < n ; ++ i) {b[i].index = i;b[i].height =a[i];}

sort(b.begin(),b.end());

vector rightMax(n,b[n-1].index);

rightMax[n-1]=b[n-1].index;for(inti = n -2; i>=0; --i){if(b[i].index > rightMax[i+1]) rightMax[i] =b[i].index;elserightMax[i]=rightMax[i+1];

}intmaxDiff = -1;for(inti =0; i< n ; ++i){

maxDiff= max(maxDiff,rightMax[i]-b[i].index);

}returnmaxDiff;

}intmain(){inta[]={9,2,3,4,5,6,7,8,18,0};intn =sizeof(a)/sizeof(a[0]);intmaxDiff =maxIndexDiff(a,n);

cout<

}

還有一種方法是利用二分查找揩页,注意j-i的值必定在0~n-1之間(索引是從0開(kāi)始的)

取中間一個(gè)值mid=(0+n-1)/2,

如果存在a[i+mid]>a[i]烹俗,則必然j-i至少是mid,繼續(xù)向上二分查找

否則萍程,j-i不超過(guò)mid幢妄,則向下二分查找

#include #include#includeusingnamespacestd;boolexist(inta[],intn,intk){for(inti =0; i+k< n; ++i){if(a[i] < a[i+k])returntrue;

}returnfalse;

}intmaxIndexDiff(inta[],intn){intleft =0, right = n-1;while(left <=right){intmid = (left+right)/2;if(exist(a,n,mid)) left=mid+1;elseright = mid-1;

}returnright;

}intmain(){inta[]={9,2,3,4,5,6,7,8,18,0};intn =sizeof(a)/sizeof(a[0]);intmaxDiff =maxIndexDiff(a,n);

cout<

}

第三種方法:

從左向右掃描一遍,記錄每個(gè)索引左邊的最小值(包括自己)茫负,leftMin[0..n-1]

從右向左掃描一遍蕉鸳,記錄每個(gè)索引右邊的最大值(包括自己),rightMax[0..n-1]

要注意的是:

對(duì)于leftMin[i]忍法,其左邊的leftMin[0..i-1]都大于等于leftMin[i]潮尝,其右邊的left[i+1..n-1]都小于leftMin[i]

對(duì)于rightMax[j],其左邊的rightMax[0..j-1]都大于等于rightMax[j]饿序,其右邊的rightMax[j+1..n-1]都小于rightMax[j]

對(duì)于leftMin[i] 和rightMax[j]

如果leftMin[i]leftMin勉失,記錄當(dāng)前的j-i,使++j

否則leftMin[i]>=rightMax[j], 則i的左邊肯定都比rightMax[j]大原探,要增大++i乱凿,

#include #include#include#includeusingnamespacestd;intmaxIndexDiff(inta[],intn){

vector leftMin(n,a[0]),rightMax(n,a[n-1]);for(inti =1; i < n; ++i ) leftMin[i] = min(a[i],leftMin[i-1]);for(inti = n-2; i>=0; -- i) rightMax[i] = max(a[i],rightMax[i+1]);inti =0, j=0, maxDiff = -1;while(i

maxDiff= max(maxDiff,j-i);

j++;

}else++i;

}returnmaxDiff;

}intmain(){inta[]={9,2,3,4,5,6,7,8,18,0};intn =sizeof(a)/sizeof(a[0]);intmaxDiff =maxIndexDiff(a,n);

cout<

}

其中數(shù)組a[n]是無(wú)序的,求a[j]-a[i]的最大值咽弦,且i

第一種方法:

從左往右求下標(biāo)0到 k - 1 的最小值MIN

從右往左求 下標(biāo)k到n -1 的最大值MAX

對(duì)于每個(gè)k都有一個(gè)MAX - MIN的值徒蟆,最后求這個(gè)值的最大值即可。

例如數(shù)組:4 5 2 6 3 1

K:1 2 3 4 5

MIN:?4 4 2 2 2

MAX:6?6 6?3 1

MAX - MIN型型,最大的值為6 - 2 = 4段审, 即為結(jié)果

第二種方法:

令b[j] = a[j + 1] - a[j],

那么a[j] - a[i]=(a[i+1]-a[i])+(a[i+2]-a[i+1])+...+(a[j]-a[i-1])

= b[i] +b[i+1]+ ...+ b[j - 1]闹蒜,

即將問(wèn)題轉(zhuǎn)化成求一個(gè)數(shù)組子序列的最大值寺枉。這個(gè)過(guò)程的算法是有O(n)的算法的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绷落,一起剝皮案震驚了整個(gè)濱河市型凳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘱函,老刑警劉巖甘畅,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疏唾,警方通過(guò)查閱死者的電腦和手機(jī)蓄氧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)槐脏,“玉大人喉童,你說(shuō)我怎么就攤上這事《偬欤” “怎么了颂暇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)柿扣。 經(jīng)常有香客問(wèn)我页响,道長(zhǎng),這世上最難降的妖魔是什么鸟缕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任晶框,我火速辦了婚禮,結(jié)果婚禮上懂从,老公的妹妹穿的比我還像新娘授段。我一直安慰自己,他們只是感情好番甩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布侵贵。 她就那樣靜靜地躺著,像睡著了一般缘薛。 火紅的嫁衣襯著肌膚如雪模燥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天掩宜,我揣著相機(jī)與錄音蔫骂,去河邊找鬼。 笑死牺汤,一個(gè)胖子當(dāng)著我的面吹牛辽旋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檐迟,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼补胚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了追迟?” 一聲冷哼從身側(cè)響起溶其,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敦间,沒(méi)想到半個(gè)月后瓶逃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體束铭,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年厢绝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了契沫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昔汉,死狀恐怖懈万,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靶病,我是刑警寧澤会通,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站娄周,受9級(jí)特大地震影響涕侈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昆咽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牙甫。 院中可真熱鬧掷酗,春花似錦、人聲如沸窟哺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)且轨。三九已至浮声,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旋奢,已是汗流浹背泳挥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留至朗,地道東北人屉符。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锹引,于是被迫代替她去往敵國(guó)和親矗钟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容