leetcode笔记
大小排序数组,找指定元素。 二分法
数组找元素k,把不是k的都放到数组前面,并返回不是k的个数。 双指针
数组平方排序到新数组——双指针
螺旋矩阵,判断的时候要写《=这样收缩到一行的时候也可以填充
区间和——前缀和,先求出从0元素开始到各个可能的区间和
—链表---
创建测试链表的简单方法
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
head.next.next.next.next.next = head.next.next # 5 -> 3 构成环
链表删除指定元素————虚拟头节点简化
自定义一个类实现链表的操作————注意写函数的时候先注意实现功能,看代码的时候注意哪里是实现功能的。比如在尾部插入链表节点 首先找到尾部,再插入节点,在下面的代码中就是while循环部分 。接下来再改bug 比如需要判断,如果原来链表就是空的,那么就不需要查末尾操作了,所以新加判断,如果空,直接把添加的指向头节点。注意不需要当前操作的,才进行判断
def addAtTail(self, val: int) -> None:new_node = ListNode(val) # 创建一个新节点if not self.head: # 如果链表为空self.head = new_node # 直接将头节点指向新节点returncurrent = self.headwhile current.next: # 遍历到链表的最后一个节点current = current.nextcurrent.next = new_node # 将新节点追加到链表的尾部
链表相交————两个指针从a链表走完到b链表交点处,两个指针从头节点到交点路程相等
链表环————快慢指针,在环内每次追一步,一定会重合。
—————哈希表——————
哈希表(Hash Table) 是一种数据结构,用于存储键值对(key-value),而 Python 的字典 dict
就是哈希表的实现。用{}创建哈希表。哈希表就是元素不是数字的数组,数组就是简单的哈希表
有效的字母异位词:和哈希表无关,用对应的数组储存26个英文字母,然后一个对应加,一个对应减,看最后数组是不是0向量
两个数组的交集:使用集合找交集,集合就是用哈希表实现的 哈希表(字典)的if in只比较key 正常列表的if in只比较元素-CSDN博客
是否快乐数:使用集合检查数字不重复,使用n = sum(int(digit) ** 2 for digit in str(n))语句实现数字各位的平方和
两个索引的值的和是目标数:num_to_index[num] = i 储存到哈希表 由于最后想要索引,所以数值是key,索引是value
四数和是0的组合数:使用哈希表,查找对应匹配的数。防止4层for循环复杂 defaultdict 的用处-CSDN博客
赎金信:把每个字符都放到哈希表里,另ransom note中的字符都包含在杂志的哈希表中
三数之和:固定第一个元素,双指针在两边,如果大于0就右指针移动 小于0就左指针移动。然后双指针在后面的元素遍历,找到使三个数相加等于0的数。再固定第二个数,此时双指针不需要遍历到第一个元素了,包括第一个元素的所又可能已经找全了
四数之和:注意每一个循环的出现,代表一个指针的迭代。注意 其中的元素实如[-1 -1 2]是可以重复的,但是输出不能出现两个[-1 -1 2]。
四数之和的一些判断怎么记忆-CSDN博客 四数之和指针迭代如下图
本题在确定了前两个指针后,最后两指针使用双指针方法,当然也可以再确定第三个指针后遍历第四个指针(暴力法)
—————字符串——————
字符串和数组一样,索引是整数,不过元素是字符,此外字符串不可被改变
s = "hello"
s[0] = "H" # ❌ 会报错
反转字符串:双指针法。或者python的s[::-1]可以直接生成一个以-1为步长的反转字符串。注意是原地反转字符串
python反转字符串-CSDN博客
----栈与队列---
栈就是数组,队列有deque。pop函数是把队列当栈用,要注意只使用队列的时候不能这么干。
在仅使用栈实现队列或者使用队列实现栈的时候就不能用双端队列的功能,单如果是实现其他功能这就可以用
逆波兰表达式求值:挨个放到栈里,碰到运算符就运算前asfsda