Rotate Image------旋转图片(in-place版本)

题目大意

    用二维数组(方阵)表示一幅图片,在O(1)空间复杂度的前提下完成图片顺时针旋转90度

解题思路

     首先,如果只是单纯旋转图片90度,可以根据当前矩阵内容将其按一定规则复制到另一个矩阵当中,然后将复制完毕的矩阵覆盖回原矩阵,但这样显然无法做到in-place。那么只能利用矩阵的一些特点来实现就地旋转,显然就只能分析本地元素位置的关系。

将方阵看成一系列变长依次减少2的正方形,这样我们每次挪动每个正方形的边缘的那些数据就不会影响其他层的数据了,如下:

        

设矩形为n×n的方阵,然后针对每一个circle来寻找规律,从外到内,依次定义每一圈(circle)的序号为k(0,1...), 其实我们只要递归地移动每一圈第一行的数据,且每个数据只需要递归移动4次,也就是说,每个数据只需要刚好每条边走一次就行了。移动完第一行其他行也就移动完毕了,这样再定义第一行的元素序号为index(0,1,...,n-1),这样根据这两个参数,可以得出每一个元素其移动一次应该到达的位置,这样就可以很轻松地在O(1)空间复杂度下完成旋转。

元素位置变动规律公式如下:

(index+1+k)*n-1-k(起点)     

   ->      (n-k)*n-1-k-index     

   ->      (n-k-index-1)*n+k      

   ->      k*(n+1)+index      

  ->      (index+1+k)*n-1-k  (回到起点位置)

这样一来,思路基本清楚,就可以非常轻松简单地写出代码

总结

    根据已知数据结构的特点来寻找合适的移动规律

代码

<span style="font-size:18px;">public class Solution {
	void dfs(int n,int k, int deep, int index, int curLoc, int curNum, int[][] matrix){
		if (deep == 4) return;
		int nextLoc = 0;
		switch(deep) {
			case 0:nextLoc = (index+1+k)*n-1-k;break;
			case 1:nextLoc = (n-k)*n-1-k-index;break;
			case 2:nextLoc = (n-k-index-1)*n+k;break;
			case 3:nextLoc = k*(n+1)+index;break;
		}
		int nextNum = matrix[nextLoc/n][nextLoc%n];
		matrix[nextLoc/n][nextLoc%n] = curNum;
		dfs(n,k,deep+1,index,nextLoc,nextNum,matrix);
	}
    public void rotate(int[][] matrix) {
    	int n = matrix[0].length;
    	for (int k = 0; k < n/2; k ++){
	    	for (int index = 0; index < n-2*k-1; index ++){
	    		int curLoc = k*(n+1)+index;
	        	dfs(n,k,0,index,curLoc,matrix[curLoc/n][curLoc%n],matrix);
	        	
	        }
    	}
    }
}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XsImageEffectversion: 1.00.321Author: HarryUse in D4,D5,D6,D7,D2005----------简要介绍:提供强大的图像处理功能,完全源代码公开,包括旋转,放大,缩小,自动校正,选择范围,裁剪,自动去除黑边,镜像等等功能。提供技术支持,最适合应用于扫描后的图像处理开发本控件原本就是应用于扫描后的图像处理,方便使用提供很好用的Demo----------安装方法:1、首先打开Delphi在菜单里选择Component-->Install Component...。2、然后在弹出对话框的Unit file name:栏点击Browse...按钮选择XsImageEffect.pas文件然后按OK。3、然后在弹出对话框里按Compile按钮编译然后保存。4、最后在XSpace控件栏里就会看到。----------使用方法: 本控件继承TImage除了拥有TImage的所有功能外另外还添加了旋转,放大,缩小,自动校正,选择范围,裁剪,自动去除黑边,镜像等等功能,是处理图像的功能大大增强。----------控件属性: SetRotateDegree: Integer //设置图像旋转角度 SelectArea: Boolean //是否可以选择区域 DragInForm: Boolean //是否可以手拖动浏览 BaseColor: Integer //自动去除颜色的基本颜色数(默认黑色) ColorArea: Integer //自动去除颜色的颜色范围(默认黑色范围) Color; //背景颜色控件方法: SetLeftRightMirror(); //水平镜像 SetTopBottomMirror(); //垂直镜像 CutOutSelect(); //裁减选择的范围 SelectAll(); //全选 GetPictureContent(); //自动获得图像范围 AutoSelectContent(); //自动选择图像范围----------技术支持:E-mail: harrymft@yahoo.com.cn----------版权所有:本控件的开发由XSpace Team著作并拥有最终著作权和使用权任何人不得以商业形式出售或翻版,用户可以进行相互分发、学习、交流和使用但要携带本说明文件。Copyright(C)XSpace Team 2005

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值