題目
輸入一個(gè)矩陣,按照從外向里以順時(shí)針的順序依次打印出每一個(gè)數(shù)字。
示例 1:
輸入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 輸出:[1,2,3,6,9,8,7,4,5]
示例 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]
劍指 Offer 29. 順時(shí)針打印矩陣 - 力扣(LeetCode)
與 力扣54題相同
54.?螺旋矩陣
思路
二維數(shù)組順時(shí)針從外往里走
可以想象成:按照 右-》下-》左 -》上 的順序一直走,走過的地方不要走即可。
1. 每走過一個(gè)地方,就標(biāo)記一下,這樣下次就不會再走這里了
2. 循環(huán)往右走,直到不能走為止(不能走:既不超出數(shù)組邊界,并且下一個(gè)地方?jīng)]有走過的標(biāo)記)
3.?循環(huán)往下走,直到不能走為止
4.?循環(huán)往左走,直到不能走為止
5.?循環(huán)往上走,直到不能走為止
6. 重復(fù)2345這四步,直到四面八方?jīng)]有一個(gè)地方可以走
代碼
class Solution {
public int[] spiralOrder(int[][] matrix) {
int i = 0;
int j = 0;
int m = matrix.length;
if (m == 0)return new int[0];
int n = matrix[0].length;
int passingFlag = Integer.MIN_VALUE;
int res [] = new int[m * n];
int p = 0;
res[p] = matrix[i][j];
matrix[i][j] = passingFlag;
//上下左右有一個(gè)地方能走就行
while ((j+1< n && matrix[i][j+1] != passingFlag)|| (i+1< m && matrix[i+1][j] != passingFlag) || (j - 1 >= 0 && matrix[i][j - 1] != passingFlag) || (i - 1 >= 0 && matrix[i-1][j] != passingFlag)){
//往右走
while (j+1< n && matrix[i][j+1] != passingFlag){
j = j + 1;
p++;
res[p] = matrix[i][j];
matrix[i][j] = passingFlag;
}
//往下走
while (i+1< m && matrix[i+1][j] != passingFlag){
i = i + 1 ;
p++;
res[p] = matrix[i][j];
matrix[i][j] = passingFlag;
}
//往左走
while (j - 1 >= 0 && matrix[i][j - 1] != passingFlag){
j = j - 1;
p++;
res[p] = matrix[i][j];
matrix[i][j] = passingFlag;
}
//往上走
while (i - 1 >= 0 && matrix[i-1][j] != passingFlag){
i = i - 1;
p++;
res[p] = matrix[i][j];
matrix[i][j] = passingFlag;
}
}
return res;
}
}
效果
可以優(yōu)化的地方:
1.走過標(biāo)記
????????走過的標(biāo)記,這里我使用的是:走過一個(gè)地方就讓那里變成最小值Integer.MIN_VALUE,但是這么做不嚴(yán)謹(jǐn),因?yàn)闇y試?yán)永餂]有走過最小值,所以我通過了。
????????官方的做法是:用一個(gè)輔助矩陣,也就是再做一個(gè)二維數(shù)組,走過原數(shù)組,就在輔助數(shù)組上標(biāo)記一下,這么做才合情合理。
2.結(jié)束條件
? ? ? ? 判斷外層大循環(huán)結(jié)束,我的條件是只要四面八方都不能走了,就停止。
? ? ? ? 官方的結(jié)束條件是,只要結(jié)果數(shù)組滿了,就結(jié)束。
? ? ? ? 這樣看來 官方的解法要比我少判斷一些東西。
也就是將
while ((j+1< n && matrix[i][j+1] != passingFlag)|| (i+1< m && matrix[i+1][j] != passingFlag) || (j - 1 >= 0 && matrix[i][j - 1] != passingFlag) || (i - 1 >= 0 && matrix[i-1][j] != passingFlag)){
替換成文章來源:http://www.zghlxwxcb.cn/news/detail-704353.html
while (p+1 < m*n){
代碼會簡潔很多文章來源地址http://www.zghlxwxcb.cn/news/detail-704353.html
到了這里,關(guān)于【LeetCode-簡單】劍指 Offer 29. 順時(shí)針打印矩陣(詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!