版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/scylhy/article/details/87798852
54. 螺旋矩阵-M
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
- 分析
经过几个版本代码的给更新,体会到,螺旋矩阵的难点在于控制输出不要重复;这里的一个解决办法:
- 先右上-|,再左下-|(并且边的两个角,在一个循环里的访问时左闭右开)
- 左下在单行或单列下的重复访问右上已经访问过的元素:
需要注意的是在单行或单列的情况下,左下遍历,会重复访问右上已经访问过的元素,所有要加上单行/列的判断条件,若是单行/列则只进行右上需要注意的是在单行或单列的情况下,左下遍历,会重复访问右上已经访问过的元素,所有要加上单行/列的判断条件,若是单行/列则只进行右上 - 奇数个元素,最后一个元素被忽略,这跟遍历的方法有关:
因为边角,在一个循环上,是左闭右开,故当矩阵有奇数个元素时,最后一个元素会被忽略掉,这个要另加处理
如图所示:
- code
package main
import "fmt"
func spiralOrder(matrix [][]int) []int {
a,b,c,d:=0,0,len(matrix)-1,0
if c>=0{ d=len(matrix[0])-1 } //{},无法获取d的长度
//[][]int{{}} ,情况,被c--,d--给消除了
var e []int
for a<=c&&b<=d{
for i:=b;i<d;i++{
e=append(e,matrix[a][i])
}
for i:=a;i<c;i++{
e=append(e,matrix[i][d])
}
for i:=d;i>b&&a<c;i--{
e=append(e,matrix[c][i])
}
for i:=c;i>a&&b<d;i--{
e=append(e,matrix[i][b])
}
if a==c||b==d{ //由于,循迹方式是不含最后一个,故当定位点在x或y轴上重叠时,会丢失元素
//其实就是,矩阵元素个数为奇数个,丢失了最后一个
e=append(e,matrix[c][d])
}
a++;b++;c--;d-- //[][]int{{}} ,情况,被c--,d--给消除了
}
return e
}
func main(){
fmt.Println(spiralOrder([][]int{}))
fmt.Println(spiralOrder([][]int{{}}))
fmt.Println(spiralOrder([][]int{{1}}))
fmt.Println(spiralOrder([][]int{{1},{2}}))
fmt.Println(spiralOrder([][]int{{1,2,3,4}}))
fmt.Println(spiralOrder([][]int{{1, 2, 3, 4},
{5,6,7,8}}))
fmt.Println(spiralOrder([][]int{{1, 2},
{3, 4},
{5,6}}))
fmt.Println(spiralOrder([][]int{{1, 2, 3, 4},
{5, 6, 7, 8},
{9,10,11,12}}))
fmt.Println(spiralOrder([][]int{{1, 2, 3 },
{4,5,6},
{7,8,9}}))
}
/*
矩阵循迹方式;
+++-
#@$-
#&^-
#***
但注意若2n+1*2n+1的矩阵,最中间的元素会被忽略;
所以要特殊处理一下最中间的元素
++—
&$—
&**
*/
- code2
class Solution {
public:
vector<int> output;
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m=matrix.size();
if(m==0)
return output;
int n=matrix[0].size();//m
if(n==0)
return output;
int a=0;
int bm=m-1;
int bn=n-1;
int b=bm>bn?bn:bm;
while(a<b&&bm&&bn)
{
output.push_back(matrix[a][a]);
for(int i=a+1;i<=bn;i++)
output.push_back(matrix[a][i]);
for(int i=a+1;i<bm;i++)
output.push_back(matrix[i][bn]);
output.push_back(matrix[bm][bn]);
for(int i=bn-1;i>=a;i--)
output.push_back(matrix[bm][i]);
for(int i=bm-1;i>a;i--)
output.push_back(matrix[i][a]);
bm--;bn--;b--;a++;
}
if(a==b)
{
if(a==bm)
{
for(int i=a;i<=bn;i++)
output.push_back(matrix[a][i]);
}else if(a==bn)
{
for(int i=a;i<=bm;i++)
output.push_back(matrix[i][a]);
}
}
return output;
}
};