文章目录
- 励志
- 一、剑指 Offer 29. 顺时针打印矩阵
- 题:
- 解:
- 二、剑指 Offer 31. 栈的压入、弹出序列
- 题:
- 解:
励志
We’re gonna do this together.
 让我们并肩作战。
一、剑指 Offer 29. 顺时针打印矩阵
题:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
解:
解题思路:距阵模拟

 AC代码:
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        int len = matrix.length;
        if(len == 0) return new int[0];
        int l = 0, r = matrix[0].length - 1, t = 0, b = len - 1;
        int[] res = new int[(r + 1) * (b + 1)];
        int x = 0;
        while(true) {
            for(int i = l; i <= r; i ++) res[x ++] = matrix[t][i]; // 左到右
            if(++t > b) break; // 上边界下移动
            for(int i = t; i <= b; i ++) res[x ++] = matrix[i][r]; // 上到下
            if(--r < l) break; // 右边界左移动
            for(int i = r; i >= l; i --) res[x ++] = matrix[b][i]; // 右到左
            if(--b < t) break; // 下边界上移动
            for(int i = b; i >= t; i --) res[x ++] = matrix[i][l]; // 下到上
            if(++l > r) break; // 左边界右移动
        }
        return res;
    }
}- 时间复杂度 O(MN): M, N分别为矩阵行数和列数。
- 空间复杂度 O(1): 四个边界 l , r , t , b 使用常数大小的额外空间。
二、剑指 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 的排列。
解:
解题思路:弹栈模拟

 AC代码:
class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack<>();
        int i = 0; // pop指针
        for(int num : pushed) { // 遍历push
            stack.push(num);
            // 模拟出栈
            while(!stack.isEmpty() && stack.peek() == popped[i]) {
                stack.pop();
                i ++;
            }           
        }
        return stack.isEmpty();
    }
}- 时间复杂度 O(N): 其中 N为列表 pushed 的长度;每个元素最多入栈与出栈一次,即最多共 2N 次出入栈操作。
- 空间复杂度 O(N): 辅助栈 stack 最多同时存储 N个元素。
                










