文章目录
54. 螺旋矩阵:
给你一个
m
行
n
列的矩阵
matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
样例 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]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
分析:
- 面对这道算法题目,二当家的陷入了沉思。
- 可以每次循环移动一步,判断移到边界就变换方向。
- 也可以每次循环都换完4次方向,也就是完成一次顺时针,然后缩圈。
题解:
rust:
implSolution{pubfnspiral_order(matrix:Vec<Vec<i32>>)->Vec<i32>{letmut ans =Vec::new();let(rows, columns)=(matrix.len(), matrix[0].len());let(mut left,mut right,mut top,mut bottom)=(0, columns -1,0, rows -1);while left <= right && top <= bottom {(left..right +1).for_each(|column|{
ans.push(matrix[top][column]);});(top +1..bottom +1).for_each(|row|{
ans.push(matrix[row][right]);});if left < right && top < bottom {(left..right).rev().for_each(|column|{
ans.push(matrix[bottom][column]);});(top +1..bottom).rev().for_each(|row|{
ans.push(matrix[row][left]);});}if right ==0|| bottom ==0{break;}
left +=1;
right -=1;
top +=1;
bottom -=1;}return ans;}}
go:
funcspiralOrder(matrix [][]int)[]int{
rows, columns :=len(matrix),len(matrix[0])
left, right, top, bottom :=0, columns-1,0, rows-1
ans :=make([]int, rows*columns)
index :=0for left <= right && top <= bottom {for column := left; column <= right; column++{
ans[index]= matrix[top][column]
index++}for row := top +1; row <= bottom; row++{
ans[index]= matrix[row][right]
index++}if left < right && top < bottom {for column := right -1; column >= left; column--{
ans[index]= matrix[bottom][column]
index++}for row := bottom -1; row > top; row--{
ans[index]= matrix[row][left]
index++}}
left++
right--
top++
bottom--}return ans
}
c++:
classSolution{public:
vector<int>spiralOrder(vector<vector<int>>& matrix){
vector<int> ans;int rows = matrix.size(), columns = matrix[0].size();int left =0, right = columns -1, top =0, bottom = rows -1;while(left <= right && top <= bottom){for(int column = left; column <= right;++column){
ans.emplace_back(matrix[top][column]);}for(int row = top +1; row <= bottom;++row){
ans.emplace_back(matrix[row][right]);}if(left < right && top < bottom){for(int column = right -1; column >= left;--column){
ans.emplace_back(matrix[bottom][column]);}for(int row = bottom -1; row > top;--row){
ans.emplace_back(matrix[row][left]);}}++left;--right;++top;--bottom;}return ans;}};
python:
classSolution:defspiralOrder(self, matrix: List[List[int]])-> List[int]:
ans =list()
rows, columns =len(matrix),len(matrix[0])
left, right, top, bottom =0, columns -1,0, rows -1while left <= right and top <= bottom:for column inrange(left, right +1):
ans.append(matrix[top][column])for row inrange(top +1, bottom +1):
ans.append(matrix[row][right])if left < right and top < bottom:for column inrange(right -1, left -1,-1):
ans.append(matrix[bottom][column])for row inrange(bottom -1, top,-1):
ans.append(matrix[row][left])
left, right, top, bottom = left +1, right -1, top +1, bottom -1return ans
java:
每次循环移动一步:
classSolution{publicList<Integer>spiralOrder(int[][] matrix){List<Integer> ans =newArrayList<Integer>();finalint rows = matrix.length, columns = matrix[0].length;int left =0, right = columns -1, top =0, bottom = rows -1;finalint total = rows * columns;int row =0, column =0;finalint[][] moveDirections ={{0,1},{1,0},{0,-1},{-1,0}};finalint[][] borderDirections ={{1,0,0,0},{0,0,1,0},{0,-1,0,0},{0,0,0,-1}};int directionIndex =0;for(int i =0; i < total; i++){
ans.add(matrix[row][column]);int nextRow = row + moveDirections[directionIndex][0], nextColumn = column + moveDirections[directionIndex][1];if(nextRow < top || nextRow > bottom || nextColumn < left || nextColumn > right){// 变换方向
directionIndex =(directionIndex +1)%4;// 修改边界
left += borderDirections[directionIndex][0];
right += borderDirections[directionIndex][1];
top += borderDirections[directionIndex][2];
bottom += borderDirections[directionIndex][3];}
row += moveDirections[directionIndex][0];
column += moveDirections[directionIndex][1];}return ans;}}
每次循环完成一个顺时针:
classSolution{publicList<Integer>spiralOrder(int[][] matrix){List<Integer> ans =newArrayList<Integer>();finalint rows = matrix.length, columns = matrix[0].length;int left =0, right = columns -1, top =0, bottom = rows -1;while(left <= right && top <= bottom){for(int column = left; column <= right;++column){
ans.add(matrix[top][column]);}for(int row = top +1; row <= bottom;++row){
ans.add(matrix[row][right]);}if(left < right && top < bottom){for(int column = right -1; column >= left;--column){
ans.add(matrix[bottom][column]);}for(int row = bottom -1; row > top;--row){
ans.add(matrix[row][left]);}}++left;--right;++top;--bottom;}return ans;}}
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~
本文转载自: https://blog.csdn.net/leyi520/article/details/130973620
版权归原作者 二当家的白帽子 所有, 如有侵权,请联系我们删除。
版权归原作者 二当家的白帽子 所有, 如有侵权,请联系我们删除。