48. Rotate Image

给你一个 n x n的2D矩阵,代表一张图片,将这个图片旋转90度。

1. 常规思路(申请额外空间)

	public void rotate(int[][] matrix)
	{
		// 先对matrix的情况进行判断
		if (matrix == null || matrix.length == 0)
			return;
		
		// 翻转后的矩阵(使用额外的空间)
		int[][] rotateMatrix = new int[matrix[0].length][matrix.length];
		
		// 进行翻转 
		for (int i=0; i<matrix.length; i++)
		{
			 for (int j=0; j<matrix[0].length; j++)
			 {
				 // 放到合适位置
				 rotateMatrix[j][matrix[0].length-1-i] = matrix[i][j];
			 }
		}
		
		for (int i=0; i<matrix.length; i++)
		{
			for (int j=0; j<matrix.length; j++)
			{
				matrix[i][j] = rotateMatrix[i][j];
			}
		}
		return;
	}

2.  通用解法

/**
	 * 顺时针旋转
	 * first reverse up to down, then swap the symmetry 
	 * 1 2 3     7 8 9     7 4 1
	 * 4 5 6  => 4 5 6  => 8 5 2
	 * 7 8 9     1 2 3     9 6 3
	 */
	public void rotate(int[][] matrix)
	{
		if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
			return;
		int rows = matrix.length; // 行数
		int cols = matrix[0].length; // 列数
		// 上下旋转
		for (int first=0, last=rows-1; first<last; first++,last--)
		{
			int[] tmp = matrix[first];
			matrix[first] = matrix[last];
			matrix[last] = tmp;
		}
		
		for (int i=0; i<rows; i++)
		{
			for (int j=i+1; j<cols; j++)
			{
				int tmp = matrix[i][j];
				matrix[i][j] = matrix[j][i];
				matrix[j][i] = tmp;
			}
		}
		return;
	}
/*
	 * 逆时针旋转
	 * first reverse left to right, then swap the symmetry
	 * 1 2 3     3 2 1     3 6 9
	 * 4 5 6  => 6 5 4  => 2 5 8
	 * 7 8 9     9 8 7     1 4 7
	*/
	public void antiRotate(int[][] matrix)
	{
		if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
			return;
		int rows = matrix.length;
		int cols = matrix[0].length;
		for (int first = 0, last = cols - 1; first < last; first++, last--)
		{
			for (int i = 0; i < matrix.length; i++)
			{
				int tmp = matrix[i][first];
				matrix[i][first] = matrix[i][last];
				matrix[i][last] = tmp;
			}
		}
		for (int i = 0; i < rows; i++)
		{
			for (int j = i + 1; j < cols; j++)
			{
				int tmp = matrix[i][j];
				matrix[i][j] = matrix[j][i];
				matrix[j][i] = tmp;
			}
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值