LeetCode:实现一般矩阵旋转

题目描述:
给你一副由N*N矩阵表示的图像,其中每个像素的大小为4个字节.请你设计一种算法,
将图像旋转90度.
可以不占用额外数组的内存空间?

示例 1:
Input:matrix=[[1,2,3],
              [4,5,6],
              [7,8,9]]
Output:[[7,4,1],
        [8,5,2],
        [9,6,2]]              

示例 2:
Input:matrix=[[5,1,9,11],
              [2,4,8,10],
              [13,3,6,7],
              [15,14,12,16]
Output:[[15,13,2,5],
        [14,3,4,1],
        [12,6,8,9],
        [16,7,10,11]]  

解题思路:

方法一

借助额外数组存放旋转后的元素,旋转前的元素坐标为:(row,col),旋转后的元素坐标为:(col,n-1-row),即m(row,col)=m(col,n-1-row)            
 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Solution{
public:
    void rotatematrix(vector<vector<int>>& matrix){
        if(matrix.empty())
           return;
        auto n=matrix.size();
        vector<vector<int>> ans(n,vector<int>(n));
        for(auto i=0;i<n;i++){
            for(auto j=0;j<n;j++){
                ans[j][n-1-i]=matrix[i][j];
            }
        }
        copy(ans.begin(),ans.end(),matrix.begin());/*以追加的方式back_inserter*/
    }

};
int main(int argc,char* argv[]){
    vector<vector<int>> matrix={{1,2,3},{4,5,6},{7,8,9}};
    Solution().rotatematrix(matrix);
    for_each(matrix.begin(),matrix.end(),[](vector<int>& res){
        cout<<"[ ";
        for(auto& num:res)
           cout<<num<<" ";
        cout<<"]"<<endl;
    });
    return 0;
}

方法二


​​​​原地进行旋转操作,在前面得到的规律是:m(row,col)=m(col,n-1-row),因此先把m(col,n-1-row)临时存储到temp中,依次推进,得到循环.其中处于循环中:

m[row][col];
m[col][n-1-row];
m[n-1-row][n-1-col];
m[n-col-1][row];

需要确定枚举的位置,当n为偶数时,(n/2)*(n/2)=n^2/4个位置,可以保证不重不漏;n为奇数时,(n-1)/2*(n+1)/2=(n^2-1)/4个位置,可以做到不重不漏;

方法三

原地双百,核心思路是用翻转代替旋转,先以对角线为轴,进行翻转.再以每一行的中点为轴,进行翻转.

对角线翻转:

m[row][col]=m[col][row]

中心翻转:

m[row][col]=m[row][n-1-col]

package main

import "fmt"

func rotatematrix1(matrix [][]int){
	if len(matrix)==0{
		return
	}
	n:=len(matrix)
	for row:=0;row<n/2;row++{
		for col:=0;col<(n+1)/2;col++{
			/*四个位置的元素进行互换*/
			temp:=matrix[n-1-col][row]
			matrix[n-1-col][row]=matrix[n-1-row][n-1-col]
			matrix[n-1-row][n-1-col]=matrix[col][n-1-row]
			matrix[col][n-1-row]=matrix[row][col]
			matrix[row][col]=temp
		}
	}
}

func rotatematrix2(matrix [][]int){
	if len(matrix)==0{
		return
	}
	n:=len(matrix)

	/*对角线翻转*/
	for row:=0;row<n;row++{
		for col:=row+1;col<n;col++{
			temp:=matrix[row][col]
			matrix[row][col]=matrix[col][row]
			matrix[col][row]=temp
		}
	}
	/*对每一行以中点进行翻转*/
	for row:=0;row<n;row++{
		for col:=0;col<n/2;col++{
			temp:=matrix[row][col]
			matrix[row][col]=matrix[row][n-1-col]
			matrix[row][n-1-col]=temp
		}
	}
}

func main(){
	fmt.Println("求旋转90度的矩阵")
	matrix:=[][]int{{1,2,3},{4,5,6},{7,8,9}}
	//rotatematrix1(matrix)
	rotatematrix2(matrix)
	fmt.Println(matrix)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值