59. 螺旋矩阵 II
题目介绍:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
思路:
本题主要就是模拟螺旋矩阵的过程,让每条边都遵循同一个规律,如都左开右闭,即留下每行或每列的最后一个元素作为下一条边的起始元素。以及每圈循环时起始坐标、边长需要改变。另外还需注意假如n为单数时,会留下最后一个中心点需要另外填充。
具体代码如下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res( n , vector<int>(n,0) ) ; //建立矩阵
int startX = 0 , startY = 0 ; //每圈的起始坐标,比如第一圈为(0,0)
int loop = n/2 ; //需要循环的圈数
int mid = n/2 ; //如果n为单数的话,会剩下最后一个中心点,坐标即(mid ,mid)
int offset = 1 ; //用于调整每圈循环的行列长度
int count = 1 ; //从1开始计数,填入矩阵中
while(loop--){
int i = startX ;
int j = startY ;
//模拟上行,从左至右填充,左闭右开
for( j ; j < n - offset ; j++ ){
res[i][j] = count++ ;
}
//模拟右列,从上至下,左闭右开
for( i ; i < n-offset ; i++){
res[i][j] = count++ ;
}
//模拟下行,从右至左,左闭右开
for( j ; j > startY ; j--){
res[i][j] = count++ ;
}
//模拟左列,从下至上,左闭右开
for( i ; i > startX ;i-- ){
res[i][j] = count++ ;
}
//每一轮循环,起始坐标加1 ,行列长度减1
startX++ ;
startY++ ;
offset++ ;
}
//如果n为单数,则填充最后的中心点
if( n%2 != 0 ) res[mid][mid] = count ;
return res ;
}
};
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
思路:
与上题不同,本题是给出了一个矩阵,需要我们按照顺时针循环输出这个矩阵且并不是等边矩阵。所以我们首先需要判断循环条件:获取矩阵的长和宽:matrix.size() 、matrix[0].size() ,再根据更小的那个数判断循环几圈,即min(matrix.size() , matrix[0].size() )/2。
每圈遵循的统一规律:左开右闭。
每圈循环时的变量:起始坐标、行的长度以及列的长度。
当行列数较小的那个为单数时,会剩下一些元素未遍历。
具体代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int startX = 0 ,startY =0 ; //每一轮起始的坐标
int m = matrix.size() ; //矩阵的行数
int n = matrix[0].size() ; //矩阵的列数
int loop , mid ;
if( m < n ){
//当行数小于列数时,根据行数来判断循环几圈
loop = m/2 ;
mid = m/2 ;
}else{
//当列数大于行数时,根据列数判断循环几圈
loop = n/2 ;
mid = n/2 ;
}
int offset = 1 ; //以此判断每轮循环时,行列的长度
vector<int> result ;
if(matrix.size() == 0 || matrix[0].size() == 0 ) return {} ; //当矩阵为空时,返回空集合
while( loop-- )
{
int i = startX ;
int j = startY ;
//遍历上行,从左至右,左开右闭
for( j ; j < n - offset ; j++){
result.push_back( matrix[i][j] ) ;
}
//遍历右列,从上至下,左开右闭
for( i ; i < m - offset ; i++ ){
result.push_back( (matrix[i])[j] );
}
//遍历下行,从右至左,左开右闭
for( j ; j > startY ; j--){
result.push_back( matrix[i][j] ) ;
}
//遍历左列 ,从下至上,左开右闭
for( i ; i > startX ; i-- )
{
result.push_back( matrix[i][j] ) ;
}
startX++ ;
startY++ ;
offset++ ;
}
//当行数或者列数为单的时候,最后一定会剩下一行或者一列数据未遍历
if( min(m,n)%2 != 0){
if(m < n){
//当行数小于列数时,剩下一行未遍历
for( int i = 0 ; i < n - 2*mid ; i++ ){
result.push_back( matrix[mid][mid+i] ) ;
}
}else{
//当行数大于等于列数的时候,剩下一列未遍历
for( int i = 0 ; i < m - 2*mid ; i++ ){
result.push_back( matrix[mid+i][mid] ) ;
}
}
}
return result ;
}
};
标签:startX,matrix,螺旋,int,练习,矩阵,mid,++
From: https://blog.csdn.net/weixin_45101231/article/details/139298101