`
frank-liu
  • 浏览: 1682174 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Rotate Image

 
阅读更多

问题描述:

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Follow up:
Could you do this in-place?

原问题链接:https://leetcode.com/problems/rotate-image/

 

问题分析

  一开始看起来,这个问题确实不太好解决,第一感觉就是很繁琐。我们先来看一个示例:

  它的变化过程是将它的每一行都变成了列的方式。比如说第1行转换后变成了第三列,第二行变成了第二列,第三行变成了第一列。因为问题中的要求,只能使用常量范围的额外空间,所以不能简单的新建一个矩阵再拷贝过去。如果能这么做的话那就太简单了, 我们按照前面的转换一行行的拷过去就可以了。

  现在牵涉到旋转这个矩阵的时候,我们该怎么做呢?我们先来看第一行的元素(0, 0)位置的元素旋转后到了(0, 2)的位置,(0, 1)的则到了(1, 2)的位置,(0, 2)到了(2, 2)的位置。下一行的元素呢?(1, 0) -> (0, 1) (1, 1) -> (1, 1)  (1, 2) -> (2, 1)。假设矩阵的长度为n的话,我们会发现对应于原来矩阵里的元素matrix[i][j]在旋转后的位置变为matrix[j][n - 1 - i]。

  这样,我们就找到了这里变化的一个规律。但是因为这里是通过替换的方式进行位置调整,所以还有一些细节需要处理。比如说,我们确定了一个元素的位置之后,它替换的原来这个元素也要继续去替换它的下一个元素。按照前面的规律同样,它也要继续这么替换直到最后一个元素覆盖了最开始我们拿来替换的元素。这里就相当于旋转了一个圈。实际上由于我们每次这么调整就需要最多4个元素,这里只需要按照这个步骤遍历调整4次就可以了。

  对于这个调整的过程,我们有必要细化一下。假定在节点matrix[i][j],那么首先我们要将我们当前要替换的那个节点的值保存一下,因为它在下一次要用到。所以我们将matrix[j][n - i - 1]赋值给一个元素p。然后将原来matrix[i][j]的值设置到这个位置。这样我们得到的这个(j, n - i - 1)又将作为下一个交换元素的起始点,继续下一个过程... 所以我们需要将新的位置索引i = j, j = n - i - 1。

  还有一个问题就是我们遍历的时候,取值的范围该怎么定?是遍历所有的元素吗?很显然不是。因为我们一个元素要这么旋转调整4次。我们实际调整的范围如下图:

  从上图可以看到,我们在两条斜线范围内的一行经过4次调整正好就覆盖了一个圈。所以我们取值只需要覆盖1/4个矩阵的那个三角部分就可以了。

 

  按照上述的讨论,我们可以得到如下的代码:

 

public class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        int x, y, temp, p, q;
        for(int i = 0; i < n / 2; i++) {
            for(int j = i; j < n - 1 - i; j++) {
                x = i;
                y = j;
                p = matrix[x][y];
                for(int k = 0; k < 4; k++) {
                    q = matrix[y][n - x - 1];
                    matrix[y][n - x - 1] = p;
                    p = q;
                    temp = y;
                    y = n - x - 1;
                    x = temp;
                }
            }
        }
    }
}

  上述的代码里复杂的地方在于我们每次调整一个元素之后要以原来的位置为基础做下一步的调整。当然,我们也可以把位置的赋值和替换提出来,得到如下的代码: 

 

public class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i = 0; i < n / 2; i++) {
            for(int j = i; j < n - 1 - i; j++) {
                int temp = matrix[i][j];
                temp = move(matrix, temp, j, n - 1 - i);
                temp = move(matrix, temp, n - 1 - i, n - 1 - j);
                temp = move(matrix, temp, n - 1 - j, i);
                temp = move(matrix, temp, i, j);
            }
        }
    }
    
    public int move(int[][]matrix,int val, int i, int j) {
        int store = matrix[i][j];
        matrix[i][j]=val;
        return store;
    }
}

 

 

  • 大小: 11.8 KB
  • 大小: 15 KB
分享到:
评论

相关推荐

    javalruleetcode-LeetCode::lollipop:个人LeetCode习题解答仓库-多语言

    java lru leetcode :ice_cream: LeetCode Kindem 的个人 LeetCode 题解仓库,欢迎交流学习。 下面的目录中 ...Rotate Image 53 Maximum Subarray 55 Jump Game 56 Merge Intervals 64 Minimum Path Sum 73

    leetcode1004-leetcode:leetcode

    Rotate Image (M) -&gt; 2 73. Set Matrix Zeroes (M) 1. Two Sum (E) 167. Two Sum II - Input array is sorted (E) 653. Two Sum IV - Input is a BST (E) -&gt; 2 26. Remove Duplicates from Sorted Array (E) 27. ...

    戳气球leetcode-leetcode:leetcode

    leetcode category other hot keywords:Palindrome(mic), Subsequence Array 螺旋矩阵Spiral Matrix 顺时针打印矩阵 Next Permutation Product of Array Except Self 189.rotate-array 283.move-zero Range Sum ...

    leetcode答案-LeetCode:LeetCode上的题解

    leetcode 答案 LeetCode 该项目是 LeetCode 上的题解。 src/easy/路径下都是难度为 ..._48_RotateImage这个类名。运行效果如下图所示: 把这个类名复制一下,新建类的时候直接把类名粘贴过去就可以了。

    leetcode跳跃-leetcode:leetcode解题之路

    旋转图像](./Array/rotate-image.md) Heap 堆 [0023 合并K个排序链表](./Heap/merge-k-sorted-lists.md) String 字符串 [0006 Z字形变换](./String/zigzag-conversion.md) [0030 串联所有单词的子串](./String/...

    lrucacheleetcode-leetcode:记录自己的leetcode解题历程~Welcomeeveryonetocomment:grinning_face:~

    Rotate Image 344. Reverse String 414. Third Maximum Number 448. Find All Numbers Disappeared in an Array 66. Plus One 238. Product of Array Except Self 697. Degree of an Array 849. Maximize ...

    C语言-leetcode题解之48-rotate-image.c

    c语言入门 C语言_leetcode题解之48-rotate-image.c

    js-leetcode题解之48-rotate-image.js

    js js_leetcode题解之48-rotate-image.js

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    LeetCode题解(java语言实现).pdf

    * Rotate Image:该题目要求将二维矩阵旋转90度,实现方法使用了循环移位的方法。 五、其他 * Set Matrix Zeroes:该题目要求将矩阵中的零元素所在的行和列置零,实现方法使用了迭代算法。 * Search Insert ...

    leetcode2sumc-LeetCode_py:LeetCode_py

    RotateImage 153 - SpiralMatrix 顺时针旋转矩阵 90 度。 首先翻转矩阵,交换对称153是直接的 01/31/2020 75 - SortColors 167 - TwoSum2 DCP 75 是一个双指针问题,如果当前项为 0,则使用 p1 p2 指向开始和结束,...

    _leetcode-python.pdf

    - Rotate Image: 给定一个二维矩阵,将它顺时针旋转90度。 - Group Anagrams: 组合所有字母异位词,即将字母顺序不同但字母组合相同的单词分组。 - Pow(X, n): 实现x的n次幂运算,需要考虑各种边界情况和性能优化。 ...

    Amazon亚麻 最新leetcode tag题

    题目如“RotateImage”、“FindAllAnagramsinaString”、“LongestPalindromicSubstring”、“SerializeandDeserializeBinaryTree”、“FirstUniqueCharacterinaString”都是对这些基础能力的考察。 3. **树和图的...

    leetcode-cpp刷题

    - **2.1.16 Rotate Image** - 将一个正方形矩阵顺时针旋转90度。 - 实现思路:先转置矩阵,然后逐行反转。 - **2.1.17 Plus One** - 给定一个表示大整数的非负数数组,将其加一。 - 实现思路:从数组末尾开始...

    c++-c++编程基础之leetcode题解第48题旋转图像.zip

    在本压缩包中,我们关注的是C++编程基础与LeetCode算法题目的结合,特别是针对LeetCode第48题——“旋转图像”(Rotate Image)的解决方案。这是一道典型的矩阵操作问题,对于理解C++中的数组和二维矩阵操作具有重要...

    LeetCode 精选 TOP 面试题(2)1

    Rotate Image)** 这个问题涉及到二维数组的旋转操作。题目的目标是将一个矩阵顺时针旋转90度。一个有效的解决方案是首先对矩阵的上半部分进行翻转,然后对整个矩阵的每一行进行反向操作。这里的时间复杂度是O(n^2...

    Leetcode代码以及解答(2)

    Rotate Image **知识点:** - **问题描述:** - 将一个 `n x n` 的图像顺时针旋转 90 度。 - **解决方案分析:** - **原地旋转:** - 先将矩阵沿主对角线翻转。 - 再将每一行反转。 - 逆时针旋转 90 度的...

Global site tag (gtag.js) - Google Analytics