题目54:螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
题解:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 取首行,去除首行后,对矩阵翻转来创建矩阵
# 再递归知道新矩阵为[],退出并将取到的数据返回
res = []
if matrix == []:
return res
res.extend(matrix[0])
new_matrix = [reversed(i) for i in matrix[1:]]
if new_matrix == []:
return res
r = self.spiralOrder([i for i in zip(*new_matrix)])
res.extend(r)
return res
运行结果:
题目59:螺旋矩阵Ⅱ
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
题解:
class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
array = [[0 for i in range(n)] for j in range(n)]
c, j = 1, 0
while c<=n*n:
# 从左向右
for i in range(j, n-j):
array[j][i] = c
c += 1
# 从上往下走
for i in range(j+1, n-j):
array[i][n-j-1] = c
c += 1
# 从右往左走
for i in range(n-j-2, j-1, -1):
array[n-j-1][i] = c
c += 1
# 从下往上走
for i in range(n-j-2, j, -1):
array[i][j] = c
c += 1
j += 1
return array
运行结果:
题目61:旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
题解:
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head: return None
orig_head, cnt = head, 1 #cnt如果会遍历到none,就从0开始计数(右开空间),如果遍历到最后有效位,就从1开始(右闭空间)
while head.next: # head遍历到了最后一位
head, cnt = head.next, cnt+1 # cnt若从1开始,且紧跟着head,那么pointer最终停到哪,cnt就包括到哪。是完全相同的
head.next = orig_head # 首尾连接上
step = cnt - k % cnt-1 # 计算有效移动步数
while step > 0:
orig_head, step = orig_head.next, step - 1
new_head, orig_head.next = orig_head.next, None
return new_head
运行结果: