請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為:要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 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 是指棧內元素 棧底到棧頂 ...