zoukankan      html  css  js  c++  java
  • 【LeetCode每天一题】Rotate Image(旋转矩阵)

    You are given an n x n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).

    Note:You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

    Example 1:

    Given input matrix = 
    [
      [1,2,3],
      [4,5,6],
      [7,8,9]
    ],
    rotate the input matrix in-place such that it becomes:
    [
      [7,4,1],
      [8,5,2],
      [9,6,3]
    ]
    

    Example 2:

    Given input matrix =
    [
      [ 5, 1, 9,11],
      [ 2, 4, 8,10],
      [13, 3, 6, 7],
      [15,14,12,16]
    ], 
    
    rotate the input matrix in-place such that it becomes:
    [
      [15,13, 2, 5],
      [14, 3, 4, 1],
      [12, 6, 8, 9],
      [16, 7,10,11]
    ]
    思路

      题目要求我们只能再本地进行旋转,不能设置辅助空间。这道题在最开始做的时候,我先在草稿纸上画出交换的过程,然后从中找出规律。发现首先对于循环次数,当n是基数的时候,最里面的一层只有一个元素,不用进行旋转,所以循环的次数应该是 start < len(nums)//2.另外在元素交换的规律上,每一列有几个元素,我们就循环几次。意思是每一次循环交换的是将所有相应位置的元素进行交换。
      时间复杂度为O(mlogm), 其中m为矩阵一行的长度。空间复杂度为O(1)。
    图解步骤


    解决代码

    
    
     1 class Solution(object):
     2     def rotate(self, matrix):
     3         """
     4         :type matrix: List[List[int]]
     5         :rtype: None Do not return anything, modify matrix in-place instead.
     6         """
     7         n = len(matrix) 
     8         for l in range(n // 2):         # 循环条件
     9             r = n  -1-l                     # 右边开始的位置
    10             for p in range(l, r):      # 每一层循环次数
    11                 q = n -1- p             # 每一次循环交换时底部元素的小标
    12                 cache = matrix[l][p]      # 对元素进行交换。
    13                 matrix[l][p] = matrix[q][l]
    14                 matrix[q][l] = matrix[r][q]
    15                 matrix[r][q] = matrix[p][r]
    16                 matrix[p][r] = cache
    17             
  • 相关阅读:
    46、Spark SQL工作原理剖析以及性能优化
    45、sparkSQL UDF&UDAF
    44、开窗函数及案例
    43、内置函数及每日uv、销售额统计案例
    42、JDBC数据源案例
    41、Hive数据源复杂综合案例
    40、JSON数据源综合案例实战
    39、Parquet数据源之自动分区推断&合并元数据
    Java 的String类
    Java学习之旅基础知识篇:面向对象之封装、继承及多态
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10719545.html
Copyright © 2011-2022 走看看