三.数组
1.二分法
(1) 二分法前提条件:有序(单调)
(2)二分法要明白查找区间的定义
查找区间的定义决定了二分法的写法。写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
(3)二分法最常用的几个场景:查找目标值,查找左右边界。
(4)二分查找框架
(5)查找一个数的二分搜索(基本的二分搜索):left<=right
次算法缺陷:无法寻找左侧边界或者右侧边界
(6)查找左侧边界的二分搜索,查找右侧边界的二分搜索
2.双指针
(1)应用:数组,链表,字符串
数组:N27删除元素,N26删除重复元素,N977有序数组的平方、
链表:N206翻转链表,N19删除链表倒数第N个节点,N160(N0207)链表相交,N141环形链表1,N142环形链表2,N876链表中点
字符串:N344翻转字符串,N125判断回文串
数相关:两数之和,三数之和,四数之和
(2)左右指针:解决数组,字符串问题。如二分查找。两个指针相向而行
快慢指针:解决链表问题。如典型的判断链表是否有环。
滑动窗口也是特殊的双指针,解决子串问题。滑动窗口是双指针的最高境界了
快慢指针:
1.判断链表是否有环:
思路:无环,fast最终会等于null;有环,fast会比slow多走一圈,最终相遇
2.判断链表是否有环,并返回入环位置
3.链表中点 4.删除链表倒数第n个节点
左右指针:
1.二分查找。
2.(1)两数之和1
(2)N167两数之和2。暴力枚举和哈希法都是针对无序数组,对于有序数组可以用双指针
3.N344反转字符串
滑动窗口:
HashMap的putIfAbsent()方法和getOrDefault方法得看看
getOrDefault方法很好用
ASCII码表:0-9 < A-Z < a-z 大小:128个字符
1.思想:N76
2.N3题每搞懂,得再看看