LeetCode棧結構演算法題 題解與思路

2021-10-09 10:48:57 字數 2540 閱讀 6181

設計乙個支援 push ,pop ,top 操作,並能在常數時間內檢索到最小元素的棧。

題解思路:

採用兩個陣列,模擬棧儲存元素的同時,比較每次入棧的值的大小將該階段最小值同樣以棧的形式存入陣列中。每次獲取最小值,只需取最小值棧的棧頂值即可。

class minstack 

public void push(int x)

min.add(min.get(min.size() - 1));

}public void pop()

list.remove(list.size() - 1);

min.remove(min.size() - 1);

}public int top()

public int getmin()

}

給定乙個只包括 '(',')','','[',']' 的字串,判斷字串是否有效。

有效字串需滿足:

1.左括號必須用相同型別的右括號閉合。

2.左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

題解思路:

利用棧結構先進後出(filo)的特性,先將第乙個字元入棧,遍歷後續字串字元判斷是否與棧頂的括號字元成對(即char對應的ascii碼int值差值為1或2),如果是成對的則讓棧頂字元出棧,否則繼續將該字元入棧繼續遍歷。遍歷結束後,如果括號字元是以正確的順訊左右閉合,那麼棧應該為空。

public boolean isvalid(string s)  else if (chars[i] - stack.peek() == 1 || chars[i] - stack.peek() == 2)  else 

}return stack.isempty();

}

第二種簡化寫法,演算法思想相同,優點是相對更簡潔,缺點就是需要多個if else判斷字元。

public boolean isvalid(string s) ');

else if (stack.isempty() || c != stack.pop()) return false;

}return stack.isempty();

}

根據逆波蘭表示法,求表示式的值。

有效的運算子包括+,-,*,/。每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。

逆波蘭表示式:

逆波蘭表示式是一種字尾表示式,所謂字尾就是指算符寫在後面。

平常使用的算式則是一種中綴表示式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

該算式的逆波蘭表示式寫法為 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波蘭表示式主要有以下兩個優點:

去掉括號後表示式無歧義,上式即便寫成 1 2 + 3 4 + * 也可以依據次序計算出正確結果。

適合用棧操作運算:遇到數字則入棧;遇到算符則取出棧頂兩個數字進行計算,並將結果壓入棧中。

public int evalrpn(string tokens) 

}return stack.pop();

}

給定乙個經過編碼的字串,返回它解碼後的字串。

編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。

你可以認為輸入字串總是有效的;輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。

題解思路:

採用兩個棧結構,分別儲存「」前的整數數字與在數字前拼接好的字串,迴圈遍歷給定字串的每個字元,字元為字母時正常拼接,當遇到數字時以變數記錄並計算轉換為整數,當遇到'['時將之前拼接好的字串與轉換好的整數入棧,將整數置為0並重新拼接內字母,最後遇到『]』從數字棧頂取出整數以其為迴圈次數,將內拼接好的字串拼接到字串棧的棧頂字串之後。最後返回拼接後的字串。

public string decodestring(string s) else if(c == '[')else if(character.isalphabetic(c))else

result = tempresult;}}

return result.tostring();

}

LeetCode演算法題 最小棧MinStack

設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。示例 minstack minstack new minstack minstack.push 2 m...

LeetCode 簡單題 棧

你現在是棒球比賽記錄員。給定乙個字串列表,每個字串可以是以下四種型別之一 1.整數 一輪的得分 直接表示您在本輪中獲得的積分數。2.一輪的得分 表示本輪獲得的得分是前兩輪有效 回合得分的總和。3.d 一輪的得分 表示本輪獲得的得分是前一輪有效 回合得分的兩倍。4.c 乙個操作,這不是乙個回合的分數 ...

LeetCode 演算法題

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...