三天了回顾一下前面的。
发现第一天漏了两题(。)
704. 二分查找
注意考虑只有一个元素的情况。
mid = left + (right - left) //2
如果确定right + left不会越界的话,其实直接right + left // 2 更快。
//是向下取整。
209. 长度最小的子数组
nums is None 和 len(nums) == 0是两个不同的条件。None是一个特殊值。len(nums)==0才是空。
(看了一下,其实不加这一句也差别不大,也很快处理完的。)
突然好奇暴力怎么写所以也看了一下。(哈哈怪不得当时没看暴力,找不到正确答案,因为题目应该是改过了。)
无论是暴力法还是滑动窗口,都是要不断比较min_len找最优值的。
有点质疑为什么时间复杂度不是O(n^2)了,也可能会是target = 10, nums = [1,1,1,1,1,1,1,1,1,1]这种情况吧。回家问一下。
看回了滑动窗口方法,题目大于等于,上次写只看到等于,这次写只写了大于,我真是个人才啊!
(其他没什么大问题了)
需要注意的是两个点。
1. 初始化二维函数:
nums = [[0]*n for _ in range(n)]
2. range(x,y, -1),怀疑之前的理解有误。
回去问问,为什么:
for i in range(n-offset,startx,-1)
而不是
for i in range(startx,n-offset)
其他都写对了。
1. 虚拟头结点写法:dummy_head = ListNode(next = head)
概念理解了,不会写语法可不行。
2. "if cur.next.val == val" 经常漏掉第一个val。记得cur.next只是指针,再.val才能读值。
206. 反转链表
双指针:今天写了今天还不会hhhh
问题出在把while(cur!=None)写成了while cur.next。
显示'NoneType' object has no attribute 'next'。
要注意每次判断时已经反转了cur节点了。
直接写while cur也是可以的。
(晚上问问为什么不能写
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur = head
pre = None
while temp := cur.next:
cur.next = pre
pre = cur
cur = temp
return pre
)
递归:居然一次写对了!
之后复习可以首要总结:看到这道题想到是什么思路。
这才是最帮助做题的。