一些基础
- 数组是一种线性的数据结构,每个节点的大小一样,在内存上连续。可以通过下标快速定位想要查询的目标值,因此数组检索的效率高。
- 数组的长度一旦设定就无法改变,删除数组的元素,事实上并不是删除,而是覆盖。数组只能通过一个新的值来覆盖旧的值。
题型
二分法
- 有序数组查找,可以使用二分法。
- 二分法最重要迷惑的点就是while循环里面是否有=,这个看情况,如果给定的数组右边是包括边界的,那么就要用=,因为当值取到最后一个元素的时候,还是可能是目标值,因此还是需要进入循环。
- 另外一个很迷惑的点就是是否新的边界是否需要+1或者-1,这个也可以根据边界进行判断,因为数组的左边界是一定包括的,所以中间的点更新为左节点的时候,需要+1;因为中间的点一定不是目标值,而数组是包括边界的,所以可以排除掉中间节点,因此肯定可以+1。
- 右节点的更新也是同理,如果可以取到右边界,而上一次判断已经知道该中间节点非需要的节点,因此可以-1.
- 推荐题:
- leetcode上面的题:
704.二分查找,
35.搜索插入位置,
34.在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根
367.有效的完全平方数
双指针
- 双指针一般用于数组的移动,比如数组的数据去重,合并数组。
- 一个指针指向下一个需要插入数据的节点,另一个指针指向要查询的数据节点;查询节点的值满足条件就把值放入要插入数据的节点。然后两个指针都往后移动。如果查询节点不满足,就查询节点往后移动。
- 最后把数组需要的部分截出来,就是自己要的结果。
- 推荐题:
27.移除元素
26.删除排序数组中的重复项
283.移动零
844.比较含退格的字符串
977.有序数组的平方
滑动窗口
- 滑动窗口一般用于在数组中查找几个相邻的数据达到某种特性,并且数据个数最少(或者最多)是多少个。
- 一般左右指针都从0开始,然后总和小于目标值,就右指针+1,并把右边的新值加入到总和里。如果总和大于目标值,就左指针+1,总和减去左指针的值。并且每次调正之后都判断新的结果是否比上一次的结果更优。
- 推荐题:
209.长度最小的子数组
904.水果成篮
76.最小覆盖子串
参考:https://mp.weixin.qq.com/s/weyitJcVHBgFtSc19cbPdw