hot100思路总结

Hot100

哈希

  1. 两数之和

遍历同时用map记录已经遍历过的元素

  1. 字母异位词分组

单词字典排序作为key,原单词作为value,最后取出map中的value作为切片

  1. 最长连续序列

map记录每个数,遍历map,从最小的数开始找记录长度


双指针

  1. 移动零

同向双指针,一个遍历元素,一个标记非零元素

  1. 盛最多水的容器

相向双指针,接水问题,高度由较短的一边决定

  1. 三数之和

排序,固定一个数后还是两数之和,相向双指针,关键是注意去重

  1. 接雨水

一个位置一个桶,一个桶两个边,桶盛水量由“前后缀的较小方决定”。每次更新左右其中一个桶,相向双指针


滑动窗口

  1. 无重复字符的最长子串(耐考王)

map记录子串元素出现次数,同向双指针->只出现一次

  1. 找到字符串中所有字母异位词

map记录目标元素出现次数,同向双指针->和目标元素出现次数一致


子串

  1. 和为 K 的子数组

子数组和问题->前缀和的差,用map记录前缀出现次数


普通数组

  1. 最大子数组和

子树数组和问题->前缀和,求最大,维护一个最小前缀和即可

  1. 合并区间

关键:go语言中的自定义排序api

  1. 轮转数组

反转整体,分别反转前后两部分

  1. 除了自身以外数组的乘积

维护前缀积和后缀积,然乘在一起


矩阵

  1. 矩阵置零

不考

  1. 螺旋矩阵

不考

  1. 旋转图像

纯背:矩阵转置->行反转

  1. 搜索二维矩阵 II

从右上角开始搜


链表

  1. 相交链表

双指针同时遍历,空指针就跑到另一个链头去

  1. 反转链表

空pre开始,返回pre结束

  1. 回文链表

1.找到链表中间;2.反转后半段;3.一个个节点遍历对比;

  1. 环形链表

快慢指针

  1. 环形链表 II

纯背:找到相交的位置,然后头节点和慢指针一起出发直至相遇

  1. 合并两个有序链表

太简单,没技巧

  1. 两数相加

定义一个进位计数变量count,取数取模,进位除十

  1. 删除链表的倒数第 N 个结点

快慢指针,注意从空节点开始

  1. 两两交换链表中的节点

纯背,没技巧

回溯

  1. 全排列

全排列问题需要每次从头遍历,且标记已经访问的元素

(77. 组合)

和排列问题区别在于顺序不重要,所以不用从头递归,且本题边界条件是指定长度

  1. 子集

空集也是子集,所以每一层调用都要收集结果

  1. 电话号码的字母组合

和77.组合差不多,不过每层的选择空间不是同一个空间

  1. 组合总和

引入状态变量,所以也要回溯,因为可以重复添加,所以从当前位置继续递归

  1. 括号生成

非边界两种情况,左括号不满可以添加左括号,右括号小于左括号可以添加右括号

  1. 单词搜索

边界:单词搜索完成,非边界:坐标越界、已经搜过(map标记)、不是单词

  1. 分割回文串

非边界:切一个子串s[i: j+1]判断是不是回文串

  1. N 皇后

背就完了,关键性质:对角线坐标性质->左上右下(坐标差相同)、右上左下(坐标和相态)