Skip to content

Latest commit

 

History

History
118 lines (72 loc) · 2.21 KB

048._rotate_image.md

File metadata and controls

118 lines (72 loc) · 2.21 KB

###48. Rotate Image

题目: https://leetcode.com/problems/rotate-image/

难度:

Medium

思路一:

rotate之前:             之后:
 1	2	3	4			13	9	5	1
 5	6	7	8			14	10	6	2
 9	10	11	12			15	11	7	3
 13	14	15	16			16	12	8	4

看网上的hint,是先沿着对角线变换一次,再验证水平中线变换一次

16	12	8	4			13	9	5	1
15	11	7	3			14	10	6	2
14	10	6	2			15	11	7	3
13	9	5	1			16	12	8	4

对角线变换的规律是 (i,j), (n-1-j,n-1-i)

上下变换规律 (i,j),(n-1-i,j)

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):
        	for j in range(n):
        		if j < n-1-i:
        			matrix[i][j],matrix[n-1-j][n-1-i] = matrix[n-1-j][n-1-i],matrix[i][j]

        for i in range(n/2):
        	for j in range(n):
        		matrix[i][j],matrix[n-1-i][j] = matrix[n-1-i][j],matrix[i][j]
        

思路二:

参考这里

http://www.lifeincode.net/programming/leetcode-rotate-image-java/

找规律,一次完成四个数的该有的变换


1 	2 	3 	4 	5 					

6 	7 	8 	9 	10 	

11 	12 	13 	14 	15 	

16 	17 	18 	19 	20 	

21 	22 	23 	24 	25 

观察一下,第一个数开始的变换是 (0,0)->(0,4)->(4,4)->(4,0) 第二个数的变换是 (0,1)->(1,4)->(4,3)->(3,0)

变换是 (x,y) -> (y, n-1-x) -> (n-1-x,n-1-y)->(n-1-y,x)

然后处理第一行是从(0,0)->(0,n-2),第二列是(1,1)->(1,n-3).

第i行(i, i)(i, n – 2 – i).终止条件也有了。

虽然都是O(N^2),但是这个比上面的稍快

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)
        
        # row, col
        for i in range(n):
            for j in range(i,n-1-i):
                matrix[i][j],matrix[j][n-1-i],matrix[n-1-i][n-1-j],matrix[n-1-j][i] = \
                matrix[n-1-j][i],matrix[i][j],matrix[j][n-1-i],matrix[n-1-i][n-1-j]

这里的问题是矩阵都是方形,如果不是方形,貌似难很多。