力扣739 每日溫度 暴力法與單調棧

2021-10-25 13:03:41 字數 2077 閱讀 8241

請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為:要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。

例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。

[30, 100] 範圍內的整數。

/**

* note: the returned array must be malloced, assume caller calls free().

*/int

*dailytemperatures

(int

* t,

int tsize,

int* returnsize)

if(j==tsize-1)

else}}

*returnsize=tsize;

return a;

}

因為最後乙個元素直接返回0即可。

/**

* note: the returned array must be malloced, assume caller calls free().

*/int

*dailytemperatures

(int

* t,

int tsize,

int* returnsize)

if(j==tsize-1)

else}}

a[tsize-1]

=0;*returnsize=tsize;

return a;

}

我們可以建造兩個動態陣列來模擬棧。

設立temp陣列來儲存每次溫度對應的原陣列裡的下標,res陣列來儲存我們真正要的答案

我們之所以用temp陣列來儲存溫度對應原陣列的下標是因為這樣的話由於儲存下標可以很快找到下標,且由於下標知道,我們也能很快的從溫度陣列中找到他對應的溫度,只需溫度陣列下標中巢狀temp陣列即可。

因為由題可知,一旦出現「氣溫在這之後都不再公升高」,則此時應給res賦值為0,所以為了避免麻煩我們可以開始就將整個陣列都初始化為0,這樣後面不用再進行賦值操作了。

從動畫可知我們利用兩個陣列來模擬的是入棧和出棧。

即:

當棧內為空時,我們需要將temp陣列匯入棧中,即直接入棧;當棧不為空時,我們需要考慮兩種情況:

1.若此時對應的溫度大於棧內儲存的溫度。即此時棧外的要進入棧的元素大於棧頂的元素。

則此時可以將棧頂的元素出棧,並計算二者在溫度陣列中的下標差,賦值給res陣列中,接著比較棧頂下面的元素與棧外的要進入棧的元素。若滿足大於,則繼續出棧及相同賦值操作,直到棧內沒有元素為止。

若小於則不出棧了,讓棧外的進棧。

2.若不大於,則其直接入棧。

/**

* note: the returned array must be malloced, assume caller calls free().

*/int

*dailytemperatures

(int

* t,

int tsize,

int* returnsize)

index++

;//要入棧,所以要更新一下棧內下標

temp[index]

=i;//入棧操作,也是借助「覆蓋」操作對一些元素完成出棧

}*returnsize=tsize;

return res;

}

且對於「*returnsize=tsize」:

因為你返回了指標,但是需要告訴外部,指標指向記憶體的長度。這就是returnsize的用處。

力扣 739 每日溫度

給定乙個整數陣列 temperatures 表示每天的溫度,返回乙個陣列 answer 其中 answer i 是指在第 i 天之後,才會有更高的溫度。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。示例 1 輸入 temperatures 73,74,75,71,69,72,76,73 輸...

力扣LeetCode 739題 每日溫度(單調棧)

題目 分析 題目的意思應該叫做 對於陣列的每乙個元素,尋找下乙個比他大的元素與他的距離 例如對於 73 下標為 0 下乙個比他大的元素為 74 下標為 1 那麼就填入 1 0 1 以此類推。直接能夠想到的方法就是暴力遍歷,對於每乙個元素向後遍歷 class solution 跳出之後沒超範圍,說明是...

739 每日溫度 單調棧

739.每日溫度 o n 2 o n 2 o n2 class solution else res i tmp return res o n o n o n class solution stack.push i return res 單調棧 monotone stack 是指棧內元素 棧底到棧頂 ...