每日算法之三十七: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?

原地图像顺时针旋转90度。因为要求空间复杂度是常数,因此应该迭代旋转操作。

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int n = matrix.size();
        int layers = n/2;//图像旋转的圈数

        for(int layer = 0;layer < layers;layer++)//每次循环一层,右青色到紫色
         for(int i = layer;i<n-1-layer;i++)//每次能够交换四个元素的位置
         {
             int temp = matrix[i][layer];//不清楚画图举例即可
             matrix[i][layer] = matrix[n-1-layer][i];
             matrix[n-1-layer][i] = matrix[n-1-i][n-1-layer];
             matrix[n-1-i][n-1-layer] = matrix[layer][n-1-i];
             matrix[layer][n-1-i] = temp;
          }
    }
};

下面是网友给出的另一种方案:

class Solution {
public:
    void rotate(vector<vector<int> > &matrix) {
        int i,j,temp;
        int n=matrix.size();
        // 沿着副对角线反转
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n - i; ++j) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][n - 1 - i];
                matrix[n - 1 - j][n - 1 - i] = temp;
            }
        }
        // 沿着水平中线反转
        for (int i = 0; i < n / 2; ++i){
            for (int j = 0; j < n; ++j) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - i][j];
                matrix[n - 1 - i][j] = temp;
            }
        }
    }
};

每日算法之三十七:Rotate Image (图像旋转),布布扣,bubuko.com

时间: 2024-12-21 10:47:42

每日算法之三十七:Rotate Image (图像旋转)的相关文章

每日算法之三十一:Combination Sum

给定一个整数序列,求解一个子序列,子序列之和等于给定目标值.子序列满足以下条件: 1)子序列是有序的 2)子序列的元素个数不限,可以是给定元素的重复元素. 3)结果中的子序列是唯一的 原题描述如下: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. The same repeat

每日算法之三十四:Multiply Strings

大数相乘,分别都是用字符串表示的两个大数,求相乘之后的结果表示. 首先我们应该考虑一下测试用例会有哪些,先准备测试用例对防御性编程会有比较大的帮助,能够考虑一些极端情况.有以下几种用例: 1)"0","0" 2)"0","879127346783" 其中一个是零 3)"as234","123343"  存在非法字符 4)"000000000000001234",&qu

每日算法之三十:Valid Sudoku (九宫格)

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

每日算法之三十五:Wildcard Matching

模式匹配的实现,'?'代表单一字符,'*'代表任意多的字符,写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for '?' and '*'.. '?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the en

每日算法之三十三:Trapping Rain Water

这是一个很有意思的问题,求解最大容积问题,值得动脑筋想一想. 原题如下: Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. The ab

每日算法之三十九:Pow(x, n)

实现浮点类型的幂运算,函数原型为: double pow(double x, int n) 在求解这个问题的时候是一个很挣扎的过程,因为它不是报错而是一直提示你超出时间,那么必须一次次的考虑怎样降低时间复杂度. 首先最直接的思路是下面这样的,就跟直观的数学求解一样. double pow(double x, int n) { if(n==0) return 1.0; if(n<0) return 1.0/pow(x,-n); return x*pow(x,n-1); } 但是会提示你超出时间,这

每日算法之三十八:Anagrams

Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. 回文字符串是指: 两个字符串的字符个数完全相同,这两个字符串是Anagrams.因此Anagrams至少指俩字符串.找出字符集合中的Anagrams组. 由此我们可以想到,只要将几个单词按照字母顺序进行排序,就可以通过比较判断他们是否是anagrams. 思路:用map

每日算法37: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? 原地图像顺时针旋转90度.由于要求空间复杂度是常数,因此应该迭代旋转操作. class Solution { public: void rotate(vector<vector<int> > &mat

[LeetCode]27. 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? 解法1:新开辟一个矩阵,空间复杂度O(n^2). class Solution { public: void rotate(vector<vector<int>>& matrix) { if(matri