C語言-常用暫存器位操作總結
阿新 • • 發佈:2021-06-22
劍指 Offer 31. 棧的壓入、彈出序列
難度中等輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 {1,2,3,4,5} 是某棧的壓棧序列,序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列,但 {4,3,5,1,2} 就不可能是該壓棧序列的彈出序列。
示例 1:
輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 輸出:true 解釋:我們可以按以下順序執行: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 輸出:false 解釋:1 不能在 2 之前彈出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed
是popped
的排列。
法一: 扣半小時的結果,左調右調,面試官是不會給你這個機會的。
class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int>nums; while(!nums.empty()) nums.pop(); int n = pushed.size(); int i = 0, cnt = 0; while(cnt < n){ while(cnt<n && i<n && pushed[i] != popped[cnt]){ nums.push(pushed[i]); i++; } while(i<n && pushed[i] == popped[cnt]) nums.push(pushed[i++]);//if while(cnt<n && !nums.empty() && nums.top() == popped[cnt]){ nums.pop(); cnt++; } if(i == n && !nums.empty()){ return false; } cout << cnt << endl; } return true; } };
法二:題解
class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> stack = new Stack<>(); int i = 0; for(int num : pushed) { stack.push(num); // num 入棧 while(!stack.isEmpty() && stack.peek() == popped[i]) { // 迴圈判斷與出棧 stack.pop(); i++; } } return stack.isEmpty(); } } 作者:jyd 連結:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/mian-shi-ti-31-zhan-de-ya-ru-dan-chu-xu-lie-mo-n-2/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
自己改造一下:
class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int>nums; while(!nums.empty()) nums.pop(); int n = pushed.size(), cnt = 0; for(int i=0; i<n; i++){ nums.push(pushed[i]); while(!nums.empty() && nums.top() == popped[cnt]){ nums.pop(); cnt++; } } if(!nums.empty()) return false; return true; } };
時間複雜度 O(N): 其中 N為列表 pushed 的長度;每個元素最多入棧與出棧一次,即最多共 2N 次出入棧操作。
空間複雜度 O(N): 輔助棧 stack最多同時儲存 N 個元素。
法三: 使用 pushed模擬棧
轉自
class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { int i = 0, j = 0; for (int e : pushed) { pushed[i] = e;//太優秀了 while (i >= 0 && pushed[i] == popped[j]) { j++; i--; } i++; } return i == 0; } }
時間:O(n)
空間:O(1)
再改造一波:
class Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { int n = pushed.size(), cnt = 0; int i = 0, j = 0; for(auto e: pushed){ pushed[i] = e; while(i>=0 && pushed[i] == popped[j]){ i--; j++; } i++; } return i == 0; } };