LeetCode騰訊精選練習50——第七天
阿新 • • 發佈:2021-01-19
題目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
執行結果: