剑指offer -- 模拟

微笑面对各种不如意!

剑指offer – 模拟

剑指 Offer 29. 顺时针打印矩阵

Difficulty: 简单

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

示例 1:

1
2
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

1
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

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n = matrix.size();
if (n == 0) return {};
// 四个边界条件
int l = 0, t = 0, b = n - 1, r = matrix[0].size() - 1;
vector<int> res;

while (1) {
// 向右输出
for (int i = l; i <= r; i++) res.push_back(matrix[t][i]);
// 如果当前循环至最底层 退出
if (++t > b) break;
// 向下输出
for (int i = t; i <= b; i++) res.push_back(matrix[i][r]);
// 如果当前循环至最左 退出
if (l > --r) break;
// 向左输出
for (int i = r; i >= l; i--) res.push_back(matrix[b][i]);
// 如果当前循环至最上 退出
if (t > --b) break;
// 向上输出
for (int i = b; i >= t; i--) res.push_back(matrix[i][l]);
// 如果当前循环至最右 退出
if (++l > r) break;
}
return res;
}
};

时间复杂度: $O(M\cdot N)$

空间复杂度: $O(1)$,只需要四个方向变量,其中 res 是输出要求空间,不算做算法空间。


剑指 Offer 31. 栈的压入、弹出序列

Difficulty: 中等

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

示例 1:

1
2
3
4
5
输入: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:

1
2
3
输入: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 的排列。

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
stack<int> stk;
int i = 0;
for (const auto& num : pushed) {
stk.push(num);
// 因为 pushed 与 popped 长度相同,不可能出现 i 在循环中超限的情况
// 所以不用单独为 i 设定判断条件
while (!stk.empty() && stk.top() == popped[i]) {
stk.pop();
i++;
}
}
return stk.empty();
}
};

时间复杂度: $O(N)$,同时遍历一次数组

空间复杂度: $O(N)$,额外栈空间


参考资料

图解算法数据结构 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com) 官方题解



----------- 本文结束 -----------




0%