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;
}
}
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
刷题经验分享
60
Leetcode文章资源分享:高效刷满500题方法论
170
这几天刷题算法,我也是入门基础,虽然还是难,思路啥的,但是温习了很多,比如map集合的containsKey等等 set的去重 map的计数等等今天刷了一道算法中等二维数组的 零矩阵 虽然还是查阅了资料但是没看题解,就是二维数组的列长度计算。。跌跌撞撞终于写出了一道中等题目[流泪][流泪],,很开心。想放弃的,但是写出来那种成就感很足,继续加油吧[呲牙]
10
才发现力扣评论区也显示ip属地了,是从今天还是昨天开始的,刚注意到[捂脸]
15
学习总结 Python 算法 前端关于过去一年的学习情况去年尝试学习了MCU学了有一周左右弃了,然后抄网上的flask框架的项目,搞到一半发现有一些前端的问题不怎么明白,然后开始刷前端当前学到BOM,然后是算法刷了100多道 目前除了动态规划不怎么行 其他题目看到都还有点思路
8
