劍指 Offer 29-順時針列印矩陣c++
題目描述
解法一 深度優先進化版法
一開始的思路是用深度優先做出來,只要指定順時針方向,用深度優先走一遍,如果沒有路可以走直接break即可。
然後就覺得既然拐點處可以特殊處理,按照原本深度優先的思想,每次越界時改變方向即可,省去深度優先嚐試其他方向的次數。
class Solution {
private:
int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int rows = matrix.size();
int columns = matrix[0].size();
vector<vector<bool>> book(rows, vector<bool>(columns));
int count = rows * columns;
vector<int> order(count);
int x = 0, y = 0;
int tx,ty;
int dir = 0;
for (int i = 0; i < count; i++) {
order[i] = matrix[x][y];
book[x][y] = true;
tx = x + next[dir][0];
ty = y + next[dir][1];
if (tx < 0 || tx >= rows || ty < 0 || ty >= columns || book[tx][ty]) dir = (dir + 1) % 4;
x += next[dir][0];
y += next[dir][1];
}
return order;
}
};
矩陣列數為m,行數為n
時間複雜度O(mn),空間複雜度O(mn);
解法二
一開始思考的過程中,有想過通過前面每次走完一個方向來減少另一個方向的可走次數,然後順時針四個方向重複,直到一個方向減少到不能走為止。
但是想到深度優先覺得自己已經行了 懶就不沒再去實現了。
然後看到住在精選的大佬就是這樣做的…
大佬的題解
class Solution:
def spiralOrder(self, matrix:[[int]]) -> [int]:
if not matrix: return []
l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
while True:
for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
t += 1
if t > b: break
for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r: break
for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
b -= 1
if t > b: break
for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
l += 1
if l > r: break
return res
時間複雜度O(m*n),空間複雜度O(1)
相關文章
- 【劍指offer】順時針列印矩陣矩陣
- 劍指offer-19:順時針列印矩陣矩陣
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- 順時針列印矩陣矩陣
- 劍指offer之順序列印陣列陣列
- JZ-019-順時針列印矩陣矩陣
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++
- 【劍指offer】調整陣列順序陣列
- 《劍指offer》:[66]矩陣中的路徑矩陣
- JS實現順時針列印陣列JS陣列
- 劍指offer:JZ12 矩陣中的路徑矩陣
- [每日一題] 第二十一題:順時針列印矩陣每日一題矩陣
- Python練習-LeetCode 第1篇 順時針列印矩陣PythonLeetCode矩陣
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 劍指 Offer 列印從1到最大n位數c++C++
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 劍指 offer(1) -- 陣列篇陣列
- 用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)Go矩陣
- 劍指offer之列印超過陣列一半的數字陣列
- 第四章:多維陣列和矩陣 --------------- 4.1 基礎題:順時針列印二維陣列陣列矩陣
- 【劍指offer】陣列中的逆序對陣列
- [劍指offer] 把二叉樹列印成多行二叉樹
- 1,2,3…n*n 的數字按照順時針螺旋的形式列印成矩陣(遞迴)矩陣遞迴
- 【劍指Offer】調整陣列順序使奇數位於偶數前面陣列
- 劍指offer——正規表示式匹配C++C++
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- 劍指Offer-37-陣列中逆序對陣列
- 《劍指offer》:[52]構建乘積陣列陣列
- 【劍指offer】把陣列排成最小的數陣列
- 劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)面試題矩陣Java