1475. 商品折扣後的最終價格

簡單 數組 單調棧

思路

每一個商品的位置應該減去距離自己最近,且價格小於等於自己的商品。
建立一個棧,記錄數字的位置,並在整個過程當中保持單調。
比如 [8,4,6,2,3][8,4,6,2,3]

  • 加入數字 88stk = [8]
  • 加入數字 44,他會把前面比自己大的數字重棧中彈出,
    對被彈出的數字 88 來說,44 就是最近的小於等於自己的數字,最後stk = [4]
  • 加入數字 66stk = [4,6]
  • 加入數字 22,彈出比自己小的數字,對被彈出的數字來說,當前數字 22 是目標,最後stk = [2]
  • 加入數字 33stk = [2,3]

程式碼

單調棧

class Solution {
public:
    vector<int> finalPrices(vector<int>& prices) {
        int n = prices.size();
        vector<int> stk;
        for(int i = 0; i < n; ++i) {
            while(!stk.empty() && prices[stk.back()] >= prices[i]) {
                // 被 pop 出來的數字,對它來說,當前位置的價格是最近的 <= 自己的數字。
                prices[stk.back()] -= prices[i]; 
                stk.pop_back();
            }
            stk.push_back(i);
        }
        return prices;
    }
};

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(n)O(n)

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色