1. 两数之和
- 用字典存储,键为数组的值,值为索引,可以清除掉重复的数字
- 遍历数组如果target-now在字典的键就返回。
2. 两数相加
- 同时遍历两个链表
- 当前结点的值相加,如果需要进位设置进位符为1,
- 如果一个链表遍历完,则这个链表后续相加的值设为0
- 注意两个链表遍历完,如果进位符还是1,需要额外加一位
3. 无重复字符的最长子串
- 子串问题采用双指针
- 用end指针遍历字符。
- 若当前字符不在字典中,长度加一,字符加入字典(键为字符,值为索引)
- 若当前字符在字典中,修改start的位置为字符字典中索引的值或者不改变(不改变的前提是字符字典中的值小于现在的start,不可以往回找)
4. 寻找两个正序数组的中位数
简单做法:
- 合并数组找中位数
复杂做法:
- 用快排来找(复习下快排)
5. 最长回文子串
- 采用中心扩展的方法
- 三种扩展情况
- 第一种当前字符和左边字符相等,考虑左两位为中心,长度+=1,left指针向左移动
- 第二种当前字符和右边字符相等,考虑右两位为中心,长度+=1,right指针向右移动
- 第三种当前字符左右字符相等,考虑以当前字符为中心,长度+=2,right指针向右,left指针向左。
11. 盛最多水的容器
- 双指针的方法
- 左指针初始化为0,右指针初始化为数组长度减1
- 计算当前左右指针构成的面积
- 如果左指针的挡板矮于右指针,左指针向右移动
- 否则右指针向左移动
- 更新最大面积
15. 三数之和
- 三指针方法
- 一个cur指针遍历数组
- left指针初始化为cur+1,right为length-1
- 目标值为target = -arr[cur]
- 如果left+right<target,left向右移动
- 如果left+right>target,right向左移动
- 等于的话记录答案,左指针向右移动,右指针向左移动,为了去重如果nums[left] == nums[left-1]还要继续移动左指针,同理右指针。
电话号码组合
- 使用dfs
- 注意传递的列表由于地址唯一,在dfs中回溯的存在会修改列表导致最后结果为空,因此追加答案的时候要res.append("".join(tmp_res)),相当于deepcopy
删除链表的倒数第N个结点
- 遍历结点,将结点的地址存入数组
- 如果倒数第N个结点为头结点,那么头结点=头结点.next
- 如果不是头结点,倒数第n个结点的next=node.next.next
- 返回数组[0]