顺时针打印矩阵

Easy 原题连接: 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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]

提示:

  1. 0 <= matrix.length <= 100
  2. 0 <= matrix[i].length <= 100

解题思路

固定顺时针:向左,向下,向右,向上

实现:

  1. 设立上下左右边界,在走完一边后,减少对应的边界范围(如:输出矩阵最上一行后,上边届从0转至1)
  2. 依据 向左,向下,向右,向上 循环执行输出,完成一端需要判断下一步是否有路可走(向左到端头,先判断向下是否可以走)

Java代码

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0 || matrix[0].length == 0) return new int[0];
        int[] ans = new int[matrix.length * matrix[0].length];
        int size=0;
        int leftNum = 0, rightNum = matrix[0].length-1;
        int onNum = 0, downNum = matrix.length-1;
        while(leftNum<=rightNum && onNum<=downNum) {
            for(int j = leftNum; j<=rightNum; j++) ans[size++] = matrix[onNum][j];
            if(++onNum > downNum)break;
            for(int i = onNum; i<=downNum; i++) ans[size++] = matrix[i][rightNum];
            if(leftNum > --rightNum)break;
            for(int j = rightNum; j>=leftNum; j--) ans[size++] = matrix[downNum][j];
            if(onNum > --downNum)break;
            for(int i = downNum; i>=onNum; i--) ans[size++] = matrix[i][leftNum];
            if(++leftNum > rightNum)break;
        }
        return ans;
    }
}

栈的压入、弹出序列

medium 原题连接:栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

示例:

输入: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
输入: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. pushed 是 popped 的排列。

解题思路

思路:

  1. 使用栈存储数组信息
  2. 如果栈为空,压入条件数组的当前值
  3. 如果当前栈顶和目标数组的当前值一致,弹出,否则一直压入条件数组,直至超过范围或和目标数组一致
  4. 循环2-3,如果最终栈全部弹出,返回true,否则一定在 3 中返回false

Java代码

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        if(pushed.length == 0) return true;
        int mid = 0,j = 1;
        Stack<Integer> stack = new Stack<>();
        stack.push(pushed[0]);
        for(int i=0; i<popped.length; i++){
            mid = popped[i];
            if(stack.isEmpty()){
                stack.push(pushed[j]);
                j++;
            }
            while(stack.peek() != mid){
                if(j>=pushed.length) return false;
                stack.push(pushed[j]);
                j++;
            }
            stack.pop();
        }               
        return true;
    }
}