概述
顺时针打印矩阵
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
题目意思是要将矩阵顺时针打印出来
- 在剑指offer中也有类似试题
解题思路如下:
观察矩形 如下 看成一个圈 上行 右列 下行 左列
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
矩形rows 行数为3 cols列数为3 行跟列都有一个范围 行数的范围为0到2 列数的范围为 0到2
设 rowstart=0 rowend=2 colstart=0 colend=2 分别辨识行的起始、结束 和列的起始和结束
打印先从第一行开始 也就是 1 2 3 开始 此时
行不变 行为rowstart 列的变化为 colstart 到 colend 也就是 0到2 number[rowstart][i] i表示列 打印完之后 rowstart ++ 表示行数往下扩大
接着打印当前 最右边列 6 9
此时列不变为 colend 行变化 为 rowstart 到 rowend 打印完后 colend-- 表示列变小
接着打印当前最下边行 8 7
同上,此时 行不变 列出 colend 变到colstart 打印完后 rowend 减小 往上走
接着打印 4
4为第一圈的最后一个边界 此时列不变 行从rowend到 rowstart 打印完后 colstart++ 列变大 往右走
上面为一个圈,接着循环就是,直到 rowstart > rowend 或者 colstart > colend
代码如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> result;
if(matrix.size()==0)
return result;
int m=matrix.size()-1;
int n=matrix[0].size()-1;
int sn=0;
int sm=0;
int i;
while(true)
{
for(i=sn;i<=n;i++)
result.push_back(matrix[sm][i]);
if(++sm>m)
break;
for(i=sm;i<=m;i++)
result.push_back(matrix[i][n]);
if(--n<sn)
break;
for(i=n;i>=sn;i--)
result.push_back(matrix[m][i]);
if(--m<sm)
break;
for(i=m;i>=sm;i--)
result.push_back(matrix[i][sn]);
if(++sn>n)
break;
}
return result;
}
};
带测试的代码
#include<iostream>
using namespace std;
void printMatrix(int number[3][4],int rows,int cols)
{
int rowstart=0;
int rowend=rows-1;
int colstart=0;
int colend=cols-1;
while(rowstart<=rowend&&colstart<=colend)
{
int i;
for( i=colstart;i<=colend;i++)
{
cout<<number[rowstart][i]<<" ";
}
++rowstart;
if(rowstart>rowend)
break;
for( i=rowstart;i<=rowend;i++)
{
cout<<number[i][colend]<<" ";
}
--colend;
if(colend<colstart)
break;
for( i=colend;i>=colstart;i--)
{
cout<<number[rowend][i]<<" ";
}
--rowend;
if(rowend<rowstart)
break;
for( i=rowend;i>=rowstart;i--)
{
cout<<number[i][colstart]<<" ";
}
++colstart;
if(colstart>colend)
break;
}
}
int main()
{
int number[3][4]={1,2,3,4,10,11,12,5,9,8,7,6};
printMatrix(number,3,4);
}
最后
以上就是慈祥季节为你收集整理的顺时针打印矩阵 行不变 行为rowstart 列的变化为 colstart 到 colend 也就是 0到2 number[rowstart][i] i表示列 打印完之后 rowstart ++ 表示行数往下扩大 接着打印当前 最右边列 6 9 此时列不变为 colend 行变化 为 rowstart 到 rowend 打印完后 colend-- 表示列变小 接着打印当前最下边行 8 7 同上,此时 行不变 列出 colend 变到colstart 打印完后 rowend 减的全部内容,希望文章能够帮你解决顺时针打印矩阵 行不变 行为rowstart 列的变化为 colstart 到 colend 也就是 0到2 number[rowstart][i] i表示列 打印完之后 rowstart ++ 表示行数往下扩大 接着打印当前 最右边列 6 9 此时列不变为 colend 行变化 为 rowstart 到 rowend 打印完后 colend-- 表示列变小 接着打印当前最下边行 8 7 同上,此时 行不变 列出 colend 变到colstart 打印完后 rowend 减所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复