Day25_顺序_剑指Offer
顺时针打印矩阵
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]
提示:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
解题思路
固定顺时针:向左,向下,向右,向上
实现:
- 设立上下左右边界,在走完一边后,减少对应的边界范围(如:输出矩阵最上一行后,上边届从0转至1)
- 依据 向左,向下,向右,向上 循环执行输出,完成一端需要判断下一步是否有路可走(向左到端头,先判断向下是否可以走)
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 之前弹出。
限制:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。
解题思路
思路:
- 使用栈存储数组信息
- 如果栈为空,压入条件数组的当前值
- 如果当前栈顶和目标数组的当前值一致,弹出,否则一直压入条件数组,直至超过范围或和目标数组一致
- 循环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;
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT蛋的个人博客!