一力扣53
1思路
- 使用zip函数,对矩阵进行解压再包装,实现旋转
- 迭代中去掉第一项,然后解压,再zip这样就是旋转后了,但是我们旋转(列表元素)后还是从第一项开始,所以我们还要反转
- 直到最后没有东西就停止迭代
2代码
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res=[]
while matrix:
res+=matrix.pop(0)
matrix = list(map(list,zip(*matrix)))[::-1]
return res
二力扣59
1思路
- 设定4个数来作为边界,每次向内卷的时候更新边界范围
- 从第二次翻转时边界就开始缩小
- 当行数小于列数时,数字是往右或者下走的,其必然是i+或者j+,反之亦然。
- 然后我们再迭代的时候每次迭代就-1,缩小边界,2次旋转就是ij都减一
2daim
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
grid = [[0 for _ in range(n)] for _ in range(n)]
b = 1
i1, j1, i2, j2 = 0, 0, n-1, n-1
while i1 <= i2 and j1 <= j2:
for j in range(j1, j2+1):
grid[i1][j] = b
b += 1
for i in range(i1+1, i2+1):
grid[i][j2] = b
b += 1
if i1 < i2:
for j in range(j2-1, j1-1, -1):
grid[i2][j] = b
b += 1
if j1 < j2:
for i in range(i2-1, i1, -1):
grid[i][j1] = b
b += 1
i1, j1 = i1 + 1, j1 + 1
i2, j2 = i2 - 1, j2 - 1
return grid
三力扣61
1思路
- 我们根据链表的性质可知,我们不能直接根据索引直接提取,为了获取索引信息并且能够让我们循环遍历寻找,我们必须要完成长度的确定和循环链表的建立
- 如果我们能够先遍历一遍链表,然后首位相连,那么我们就可根据长度与k确定多少次后是断点
- 我们遍历到断点时,读取next后将next剪断成none
- 这样旋转就完成了
代码
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head or not head.next or k<1:
return head
res=head
length=1
while res.next is not None:
length += 1
res = res.next
res.next = head
t=(length-k)%length
l=1
for i in range(t):
res=res.next
m=res.next
res.next=None
return m
今日总结:
第二个矩阵旋转好难啊,思路有点不清晰,半抄上去的,希望分享的时候有大佬讲细一些