日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

栈的基础概念与经典题目(Leetcode题解-Python语言)

發布時間:2023/12/4 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的基础概念与经典题目(Leetcode题解-Python语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧是先入后出后入先出)的數據結構,常用操作就 push 和 pop,Python中用列表實現即可,基本概念可以看Leetbook相關章節。

普通棧

232. 用棧實現隊列

class MyQueue:def __init__(self):self.stack1 = []self.stack2 = []self.size = 0def push(self, x: int) -> None:while self.stack2:self.stack1.append(self.stack2.pop())self.stack1.append(x)self.size += 1def pop(self) -> int:while self.stack1:self.stack2.append(self.stack1.pop())self.size -= 1ans = self.stack2.pop()while self.stack2:self.stack1.append(self.stack2.pop())return ansdef peek(self) -> int:return self.stack1[0]def empty(self) -> bool:return self.size == 0

兩個棧,用 stack1 來存放 push 進來的數,當要 pop 的時候,借助 stack2 把最左邊的數 pop 出去(相當于 popleft),然后再把剩余的數放回 stack1,由于需要判斷空,所以用一個 size 大小來記錄。

155. 最小棧(劍指 Offer 30. 包含min函數的棧)

class MinStack:def __init__(self):self.stack = [(0, float('+inf'))]def push(self, x: int) -> None:self.stack.append((x, min(self.stack[-1][1], x)))def pop(self) -> None:self.stack.pop()def top(self) -> int:return self.stack[-1][0]def getMin(self) -> int:return self.stack[-1][1]

實現最小棧的關鍵就是要用輔助棧記錄每次 push 操作時的最小值,這樣棧值在遞增時,最小值永遠是第一個值(如 [1, 2, 3, 4] 對應 [1, 1, 1, 1]);在遞減時,最小值永遠是當前值(如 [4, 3, 2, 1] 對應 [4, 3, 2, 1])。

1047. 刪除字符串中的所有相鄰重復項

class Solution:def removeDuplicates(self, s: str) -> str:stack = []for ch in s:if stack and stack[-1] == ch:stack.pop()else:stack.append(ch)return ''.join(stack)

棧的最重要的應用就是匹配,這是由它后入先出的性質所決定的。

20. 有效的括號

class Solution:def isValid(self, s: str) -> bool:if len(s) % 2 == 1:return Falsestack = []for ch in s:if ch in ('(', '[', '{'):stack.append(ch)else:if len(stack) == 0:return Falsepre = stack.pop()if (pre == '(' and ch != ')') or (pre == '[' and ch != ']') or (pre == '{' and ch != '}'):return Falsereturn len(stack) == 0

首先判斷長度,若為奇數必然不能匹配,直接返回 False。然后分類討論:如果是三個左括號之一,就 push 進入棧;如果是三個右括號之一,就檢查棧頂,若棧頂為空就肯定不匹配,不為空則考察彈出的棧頂元素,若不是對應的左括號則返回 False。最后如果還有左括號(棧非空),也返回 False。

227. 基本計算器 II

class Solution:def calculate(self, s: str) -> int:stack = []size = len(s)index = 0op = '+'while index < size:if s[index] == ' ':index += 1continueif s[index] in '+-*/':op = s[index]elif s[index].isdigit():num = ord(s[index]) - ord('0')while index + 1 < size and s[index+1].isdigit():index += 1num = num * 10 + ord(s[index]) - ord('0')if op == '+':stack.append(num)elif op == '-':stack.append(-num) elif op == '*':top = stack.pop()stack.append(top * num)elif op == '/':top = stack.pop()stack.append(int(top / num))index += 1return sum(stack)

這題與上一個的括號題類似,也是分類討論。如果遇到空格則跳過;如果遇到符號則記錄下來;如果遇到數字,則根據其前面的符號來進行相應的運算。這里用 while 循環是因為要處理多位數字的情況,如 42 這種數,在遇到符號前都將其作為一個數(而不是 4 和 2 兩個數)。

150. 逆波蘭表達式求值

class Solution:def evalRPN(self, tokens: List[str]) -> int:stack = []size = len(tokens)index = 0while index < size:if tokens[index] in '+-*/':second = stack.pop()first = stack.pop()if tokens[index] == '+':num = first + secondelif tokens[index] == '-':num = first - secondelif tokens[index] == '*':num = first * secondelif tokens[index] == '/':num = int(first / second)stack.append(num)index += 1else:stack.append(int(tokens[index]))index += 1return stack.pop()

仿照上一題的寫法,同樣是分類討論,字符是數字的話就入棧,是運算符的話就讓兩個操作數出棧,進行運算后把結果再入棧。由于這題多位數是直接給出來了的,所以可以用 for 循環而不是 while 循環,如下所示:

class Solution:def evalRPN(self, tokens: List[str]) -> int:stack = []for token in tokens:if token == '+':stack.append(stack.pop() + stack.pop())elif token == '-':stack.append(-stack.pop() + stack.pop())elif token == '*':stack.append(stack.pop() * stack.pop())elif token == '/':stack.append(int(1/stack.pop()*stack.pop()))else:stack.append(int(token))return stack.pop()

946. 驗證棧序列(劍指 Offer 31. 棧的壓入、彈出序列)

class Solution:def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:pop_pointer = 0stack = []for num in pushed:stack.append(num)while stack and pop_pointer < len(popped) and stack[-1] == popped[pop_pointer]:stack.pop()pop_pointer += 1return pop_pointer == len(popped)

用指針記錄 popped 序列,然后逐個把 pushed 序列的元素 push 進入棧中,如果出現相同值,則彈出棧頂元素,同時指針右移1位,如果所有元素都能pop 則返回 True。

單調棧

496. 下一個更大元素 I

class Solution:def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:ans = []stack = []num_map = dict()for num in nums2:while stack and stack[-1] < num:num_map[stack[-1]] = numstack.pop()stack.append(num)for num in nums1:ans.append(num_map.get(num, -1))return ans

利用單調棧和字典記錄下 nums2 中每個元素右邊第一個比自己大的元素,然后遍歷 nums1 從字典找相應答案即可。

503. 下一個更大元素 II

class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:n = len(nums)ans = [-1 for _ in range(n)]stack = []for i in range(n * 2):while stack and nums[i % n] > nums[stack[-1]]:index = stack.pop()ans[index] = nums[i % n]stack.append(i % n)return ans

通過循環 2n 次可以達到循環數組的效果,但畢竟答案要的索引是 n 個,所以通過對 n 取余來表示原數組的下標。

739. 每日溫度

class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n = len(temperatures)ans = [0 for _ in range(n)]stack = []for i in range(n):while stack and temperatures[stack[-1]] < temperatures[i]:index = stack.pop()ans[index] = i - indexstack.append(i)return ans

遍歷每一天的溫度,用一個棧記錄每天的溫度下標,當遍歷到第 i 天時,比較第 i 天是否大于前面某天的溫度,如果是則彈出該天(已找到答案),并在 ans 數組中記錄下天數(差值)。

316. 去除重復字母(1081. 不同字符的最小子序列)

class Solution:def removeDuplicateLetters(self, s: str) -> str:stack = []counter = collections.Counter(s)for ch in s:if ch not in stack:while stack and ch < stack[-1] and counter[stack[-1]] > 0:stack.pop()stack.append(ch)counter[ch] -= 1return ''.join(stack)

首先用字典記錄下每個字符出現的次數,然后從左往右遍歷字符串。對于每一個字符,如果它已經在單調遞減棧里面了,則不需要入棧,直接次數減 1;如果它不在棧里,則判斷棧頂元素是否可以出棧(比當前字符大且不是剩下的唯一字符),之后再將字符入棧。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的栈的基础概念与经典题目(Leetcode题解-Python语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品影院 | 亚洲熟妇av乱码在线观看 | 红桃视频隐藏入口 | 久久色网站| 1024国产在线 | 99视频这里有精品 | 一区二区精品国产 | 日韩人妻精品中文字幕 | 日韩少妇一区二区 | 中文字幕7 | 免费级毛片 | 色老头一区二区三区 | 国产亚洲欧美日韩精品 | 精品熟妇一区二区三区 | 我爱我色成人网 | 1区2区3区在线观看 久久久久久久久久久影院 成人网址在线观看 | 天天干干干| 日本久久中文字幕 | 丝袜一区二区三区四区 | 日日干日日插 | 自由成熟xxxx色视频 | 色国产精品 | 8x8ⅹ国产精品一区二区 | 六月婷婷中文字幕 | 国产又粗又黄又爽 | 久久成人黄色 | 亚洲一区精品在线 | 国产乱码一区二区三区在线观看 | 久久久久国产精品无码免费看 | 国产在线拍揄自揄拍无码 | 在线观看国产小视频 | 国产精品久久久久久福利 | 美女扒开尿口给男人桶 | 国产视频一区在线 | 国产一区视频在线免费观看 | av资源首页 | 韩国黄色大片 | 午夜精品成人 | 性高潮免费视频 | 色国产在线 | 国产97色在线 | 国产 | a网站在线观看 | 波多野结衣在线观看一区 | 亚洲精品www| 中文字幕另类 | 吊视频一区二区三区 | 小情侣高清国产在线播放 | 欧美亚洲国产视频 | 精品人妻一区二区三区四区久久 | 免费在线成人av | 熟女视频一区 | 日韩免费一二三区 | 中文在线a∨在线 | 欧洲美一区二区三区亚洲 | 欧美精品一二三 | 久草www| www.av网| 男女猛烈无遮挡 | 国产视频在线一区 | 一区二区日韩视频 | 美女裸体网站久久久 | 荒野求生21天去码版网站 | 在线天堂www在线国语对白 | 精人妻无码一区二区三区 | 黄色777| 精品成人在线 | 黄色avv| 亚洲av首页在线 | www.rihan| 免费一级a毛片 | 婷婷tv| 91你懂的 | 亚洲熟悉妇女xxx妇女av | 欧美一区二 | 久久久丁香 | 欧美日韩一区二区区 | 嫩草一二三 | 伊人日日夜夜 | 超碰精品在线观看 | 亚洲av无码一区二区乱子伦 | 中文字幕有码在线播放 | 黄片毛片在线免费观看 | 黄金网站在线观看 | av高清在线| 青青草原综合久久大伊人精品 | 91香蕉久久 | 97毛片 | 欧美特黄| 日韩偷拍一区 | 日本欧美激情 | 波多野结衣亚洲一区 | 日韩久久精品一区二区 | 国产精品久久久久久久久久辛辛 | 亚洲一区二区美女 | 半推半就一ⅹ99av | 国产精品国产三级国产aⅴ无密码 | 免费观看的av | 第一章激情艳妇 | 干极品美女|