スタック関連の古典的な質問:毎日の温度

      トピック:

     日次气温リストに従って、リストを再生成してください。位置に対応する入力は、温度がその日の日数よりも高くなるまで待機する必要がある時間です。その後上昇しない場合は、代わりに0を使用してください。

     たとえば、リスト温度= [73、74、75、71、69、72、76、73]の場合、出力は[1、1、4、2、1、1、0、0]になります。

     ヒント:温度リストの長さの範囲は[1、30000]です。各温度の値はFahrenheitであり、[30、100]の範囲の整数です。

 

アイデア:単調なスタックを使用して問題を解決する

//单调栈
func dailyTemperatures(T []int) []int {
    length := len(T)
    ans := make([]int, length)

    //栈
    stack := []int{}
	
    for i := 0; i < length; i++ {
       //当前温度
        temperature := T[i]
        for len(stack) > 0 && temperature > T[stack[len(stack)-1]] {
            //	prevIndex 是栈顶下标
            prevIndex := stack[len(stack)-1]

            //	stack[:len(stack)-1] 不包括len(stack)-1对应的元素
            //弹栈	
            stack = stack[:len(stack)-1]
           //下标赋值
            ans[prevIndex] = i - prevIndex
        }
        //入栈
        stack = append(stack, i)
    }
	
    return ans
}

新しい要素がスタックにプッシュされるたびに、スタックの一番上の要素と比較する必要があります。新しい要素がスタックの一番上の要素よりも大きい場合、スタックがポップされ、添え字が計算されます。次に、スタックをポップした後、新しい要素をスタックの一番上の要素と比較し、前の操作を繰り返します。新しい要素がスタックの一番上の要素よりも小さい場合、新しい要素はスタックにプッシュされます。それより少ない場合は、スタックに直接プッシュされます。

このように、スタック内の要素は単調であり、最大の要素がスタックの一番下にあります。

要素がスタックにプッシュされるとき、対応する添え字と要素の値を元の配列に保存する必要があります。

時間の複雑さ:O(n)

スペースの複雑さ:O(n)

 

参照アドレス:https//leetcode-cn.com/problems/daily-temperatures/solution/mei-ri-wen-du-by-leetcode-solution/

おすすめ

転載: blog.csdn.net/ma2595162349/article/details/108904385