leetcode刷题心得
一、数组
1. 二分查找
704,35,34,69,367
1.1 循环临界点
1.2 向上取整
mid=Math.floor((left+right)/2)
mid=(left+right)>>1
- 当只有两个数时,取左边的数
1.3 向下取整
mid=(left+right+1)/2
- 当只有两个数时,取右边的数
2. 双指针
27,26,283,844,977
2.1 同方向
- 一个slow一个fast
- fast:遍历数组,检测每个数字是否符合条件
- slow:存储符合条件的数字
- 优点:保留数组已有顺序
- 缺点:如果不符合条件的数字靠前,要替换的次数比较多
2.2 相反方向
- 一个left一个right
- left:用来检测每个数字是否符合条件
- right:将不符合条件的进行替换
- 优点:要替换的次数相对较少
- 缺点:改变数组已有顺序
3. 滑动窗口
209,904,76
- 一个或者多个left一个right
- left:存储符合条件的元素
- right:判断当前元素是否符合要求
- 流程:
- 一开始left不动,right向右移动,直到找到刚刚符合要求的子序列;
- 向右移动left直到当前序列不满足要求,停止left
- 向右移动right直到当前序列满足要求,从而找到新的序列
- 比较两个序列,选择最优
- 重复操作直到right走到序列终点
4. 螺旋矩阵
59,54,29
二、链表
203,707,206,24,19,面试题02.07,142
- 如果没有虚拟头节点dummyNode,则需要特别处理链表头部的插入和删除操作;如果有dummyNode则不需要特别处理
三、哈希表
242,1002,349,202,454