• 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?

    题目要求顺时针翻转一个二维矩阵,简单直接的思路是从里向外,以矩阵中心为中心,一瓣一瓣旋转。但是这样需要借助temp作为中间存储,规则也比较麻烦。一个比较tricky的思路是对矩阵进行两次对称翻转。一种翻转方法是,先沿着副对角线翻转一次,之后再上下翻转一次。另外一种是先上下翻转,之后再沿主对角线翻转。(主对角线是指 左下到右上,副对角线是指左上到右下)。方法一示意图如下:

    方法二示意图如下:

         

    第一种解法代码如下:

    class Solution(object):
        def rotate(self, matrix):
            """
            :type matrix: List[List[int]]
            :rtype: void Do not return anything, modify matrix in-place instead.
            """
            n = len(matrix)
            for i in range(n-1):
                for j in range(n-1-i):
                    matrix[n-1-j][n-1-i],matrix[i][j] = matrix[i][j],matrix[n-1-j][n-1-i]
            matrix.reverse()
            return 

    第二种代码实现如下:

    class Solution(object):
        def rotate(self, matrix):
            """
            :type matrix: List[List[int]]
            :rtype: void Do not return anything, modify matrix in-place instead.
            """
            n = len(matrix)
            matrix.reverse() 
            
            for i in range(0,n-1):
                for j in range(i+1,n):
                    matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
            return 

    时间复杂度都是O(n^2),空间复杂度O(1)。但是可以发现沿主对角线翻转比沿辅对角线翻转要方便很多,只需要交换index,不需要计算。另外注意的是每次交换其实只要操作一半数组。全部操作反而无效。

  • 相关阅读:
    js绑定事件方法:addEventListener的兼容问题
    jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别讲解
    jQuery事件绑定函数:on()与bind()的差别
    click事件的累加绑定
    HTML标签marquee实现滚动效果
    原生js添加类名,删除类名
    CSS相邻兄弟选择器
    视差滚动
    纯js实现分页
    下拉加载更多内容(滚动加载)
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5470943.html
Copyright © 2020-2023  润新知