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

2021-10-24 07:16:21 字數 1835 閱讀 8687

給你乙個陣列 prices ,其中 prices[i] 是商店裡第 i 件商品的**。

商店裡正在進行**活動,如果你要買第 i 件商品,那麼你可以得到與 prices[j]

相等的折扣,其中 j 是滿足 j > i 且 prices[j] <= prices[i] 的 最小下標 ,

如果沒有滿足條件的 j ,你將沒有任何折扣。

請你返回乙個陣列,陣列中第 i 個元素是折扣後你購買商品 i 最終需要支付的**。

輸入:prices = [8,4,6,2,3]

輸出:[4,2,4,2,3]

解釋:商品 0 的**為 price[0]=8 ,你將得到 prices[1]=4 的折扣,所以最終**為 8 - 4 = 4 。

商品 1 的**為 price[1]=4 ,你將得到 prices[3]=2 的折扣,所以最終**為 4 - 2 = 2 。

商品 2 的**為 price[2]=6 ,你將得到 prices[3]=2 的折扣,所以最終**為 6 - 2 = 4 。

商品 3 和 4 都沒有折扣。

address

"""

題目中的資訊告訴我們,如果想要獲得折扣,則必須獲取後方乙個小於等於該元素的值,因此可以使用單調棧。

如何維護乙個單調棧,筆者用[8,4,6,2,3]這一例子配合**來說明:

設:空棧stack,prices副本result【也是結果儲存空間】,開始遍歷prices

(1)第一次迴圈因為stack為空所以必定入棧,此時stack:[0],result:[8,4,6,2,3];

(2)第二次迴圈prices[1]==4 <= prices[stack[-1]]==8,因此觸發折扣條件,減去折扣並彈出棧頂元素,然後將i==1入棧,此時stack:[1],result:[4,4,6,2,3];

(3)第三次迴圈無法觸發折扣條件,於是i==2入棧,此時stack:[1,2],result:[4,4,6,2,3];

(4)第四次迴圈prices[3]==2 <= prices[stack[-1]]==6,觸發折扣條件,減去折扣並彈出棧頂元素,迴圈判斷是否觸發折扣條件,將i==3入棧,此時stack:[3],result:[4,2,4,2,3];

(5)第五次迴圈無法觸發折扣條件,於是i==4入棧,此時stack:[3,4],result:[4,2,4,2,3];

(6)迴圈結束,返回結果result

注意:折扣條件是指stack非空且符合**條件

"""from typing import list

deffinal_price

(prices: list[

int])-

> list[

int]

: stack, result =

,[i for i in prices]

for i in

range

(len

(prices)):

# 當stack非空且stack棧頂元素在prices對應的值大於prices[i]時觸發while迴圈

while stack and prices[stack[-1

]]>= prices[i]

: result[stack[-1

]]-= prices[i]

# 將stack中所有對應在prices的滿足**條件的值都減去prices[i]

stack.pop(

)# 彈出棧頂元素

# 儲存索引

return result

LeetCode1475 商品折扣後的最終價格

一.題目 題目 示例 二.方法一 暴力法 解題思路 解題 def finalprices self,prices list int list int index 0while index len prices right index 1while right len prices if prices...

題目 商品折扣後的最終價格

給你乙個陣列 prices 其中 prices i 是商店裡第 i 件商品的 商店裡正在進行 活動,如果你要買第 i 件商品,那麼你可以得到與 prices j 相等的折扣,其中 j 是滿足 j i 且 prices j prices i 的 最小下標 如果沒有滿足條件的 j 你將沒有任何折扣。請你...

最簡單的商品模組資料庫設計

1.商品表 goods gooid 商品編號 gooname 商品名稱 gooprice typeid 商品型別編號,也就是屬於哪種型別的商品 基本的商品屬性。省略 2.goodstype 商品型別,可以無限級分類,這個應該很簡單,不在這裡詳細說明了 typeid 型別編號 typename 型別名...