1. 程式人生 > 其它 >C語言-常用暫存器位操作總結

C語言-常用暫存器位操作總結

劍指 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 之前彈出。

提示:

  1. 0 <= pushed.length == popped.length <= 1000
  2. 0 <= pushed[i], popped[i] < 1000
  3. pushedpopped的排列。

法一: 扣半小時的結果,左調右調,面試官是不會給你這個機會的。

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;
    }
};