###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]
这里的问题是矩阵都是方形,如果不是方形,貌似难很多。