調(diào)步遍歷
跳步遍歷思想充岛,適用于求取數(shù)組中元素左側(cè)/右側(cè)的比其大或小的值访诱,前面處理過的元素可以為后面處理過的元素服務(wù)麻蹋,注意有些是正序遍歷赊琳,有些是逆序遍歷输涕。
場景一
每日溫度
https://leetcode-cn.com/problems/daily-temperatures/
根據(jù)每日 氣溫 列表,請(qǐng)重新生成一個(gè)列表慨畸,對(duì)應(yīng)位置的輸入是你需要再等待多久溫度才會(huì)升高超過該日的天數(shù)莱坎。如果之后都不會(huì)升高,請(qǐng)?jiān)谠撐恢糜?0 來代替寸士。
例如檐什,給定一個(gè)列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應(yīng)該是 [1, 1, 4, 2, 1, 1, 0, 0]弱卡。
提示:氣溫 列表長度的范圍是 [1, 30000]乃正。每個(gè)氣溫的值的均為華氏度,都是在 [30, 100] 范圍內(nèi)的整數(shù)婶博。
題目理解:
實(shí)際上就是找出當(dāng)前遍歷到的元素的右側(cè)瓮具,比其大的元素。
常規(guī)解法:
兩層for循環(huán)凡人,第一層遍歷數(shù)組元素名党,第二層將當(dāng)前遍歷到的元素和右邊其它元素進(jìn)行遍歷比較,直到找出比其大的元素挠轴。
推薦解法:
如何找出右側(cè)比其大的元素传睹?
1、逆序遍歷岸晦,索引較大的位置計(jì)算出來后可以為索引較小的服務(wù)
2欧啤、遍歷比較時(shí)跳步遍歷睛藻,不用依次輪詢
3、如果某個(gè)元素右側(cè)沒有比其大的元素了邢隧,則用此元素做比較時(shí)可以直接break
class Solution {
public int[] dailyTemperatures(int[] T) {
int length = T.length;
int[] result = new int[length];
// 逆序遍歷店印,索引較大的位置計(jì)算出來后可以為索引較小的服務(wù)
for (int i = length-2; i >= 0; i--) {
// 跳步遍歷,不用依次輪詢
for (int j = i+1; j < length; j+=result[j]) {
if (T[j] > T[i]) {
// 如果T[j]大于T[i]倒慧,則得出當(dāng)前i索引下的結(jié)果
result[i] = j - i;
break;
} else if (result[j] == 0) {
// 這步很關(guān)鍵吱窝,如果T[j]不大于T[i],且后面沒有比T[j]還要大的數(shù)迫靖,則后面也沒有比T[i]還要大的數(shù)
// 此時(shí)當(dāng)前i索引下的結(jié)果為0,和默認(rèn)值一致兴使,不用重復(fù)設(shè)置
break;
}
}
}
return result;
}
}