48.旋转图像
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
这个题目在左神的算法课里有讲过。
思想:宏观的考虑数据的变动。给定矩阵,考虑一层一层变换。对于一层,给定左上角点和右下角点,对于一个点,就会有相应的四个点,数字进行交换。 如果陷入坐标变换,就会十分麻烦。
问题延伸:转圈打印矩阵,之字形打印矩阵。(不拘泥于坐标,而是考虑整体、宏观的变换。
延伸问题阅读
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int len = matrix[0].size();
for(int i=0; i<len;i++){
pt(matrix,i,len-1-i);
}
}
void pt(vector<vector<int>>& matrix, int posup, int posdown){
int temp;
for(int i =0; i<posdown-posup;i++){
temp =matrix[posup][posup+i];
matrix[posup][posup+i] = matrix[posdown-i][posup] ;
matrix[posdown-i][posup] =matrix[posdown][posdown-i];
matrix[posdown][posdown-i] = matrix[posup+i][posdown];
matrix[posup+i][posdown] = temp;
}
}
};
54.螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
思路: 也是要总结宏观的规律,给定左上角和右下角点,顺序输出一圈的元素。注意最中心只有一行或者一列要特殊讨论
代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> sb;
if(matrix.size()==0) return sb;
int i=0;
int x=matrix.size()-1;
int y=matrix[0].size()-1;
while(i<=x && i<=y){
pt(matrix,i,i,x,y,sb);
i++;
x--;
y--;
}
return sb;
}
void pt(vector<vector<int>>& matrix, int leftx,int lefty, int rightx, int righty,vector<int>& sb){
int i=leftx;
int j=lefty;
if (leftx==rightx && lefty ==righty) {
sb.push_back(matrix[leftx][leftx]);
return;}
if(leftx==rightx){
while(j<=righty){
sb.push_back(matrix[leftx][j]);
j++;
}
return;
}
if(righty==lefty){
while(i<=rightx){
sb.push_back(matrix[i][lefty]);
i++;
}
return;
}
while(j<righty){
sb.push_back(matrix[i][j]);
j++;
}
while(i<rightx){
sb.push_back(matrix[i][j]);
i++;
}
while(j>lefty ){
sb.push_back(matrix[i][j]);
j--;
}
while(i>leftx){
sb.push_back(matrix[i][j]);
i--;
}
}
};
59.螺旋矩阵ll
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路:同样是要宏观地表达。给定左上角点和右下角点,可以确定一圈的数字。 定义一个函数用来填数字,并且返回填入的数字,让下一圈继续这个数字填。
注意: vector矩阵在初始化的时候要确定大小。vector<vector> sb(n,vector(n,0));
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int num=1;
int i=0;
int j=n-1;
vector<vector<int>> sb(n,vector<int>(n));
while(i<=j){
num = pr(sb,i++,j--,num);
}
return sb;
}
int pr(vector<vector<int>> &sb,int left,int right,int num){
if(left==right){
sb[left][left]=num++;
return num;
}
int i=left;
int j=left;
while(i<right){
sb[j][i++] = num++;
}
while(j<right){
sb[j++][i] = num++;
}
while(i>left){
sb[j][i--]=num++;
}
while(j>left){
sb[j--][i]=num++;
}
return num;
}
};