代码随想录算法训练营第一天|704,34,35(二分查找),27(双指针)

二分查找

1. 使用条件:数组,升序,值不唯一。
2. 时间复杂度 O(logn)

可分为左闭右闭,左闭右开两种区间类型来求解。

  1. 左闭右闭:left = 0, right = nums.Length-1,while(left<=right),right = middle - 1.
  2. 左闭右开:left = 0, right = nums.Length,while(left<right),right = middle.

在二分查找过程中,如果middle下标的值为目标值,那么就会直接返回,不再进行下一次二分查找。

如果目标值在数组中不存在,那么会二分查找到最后,如果时左闭右闭,left最后会等于right,反之是左闭右开,left会等于right-1。

  • 但无论哪一种区间,最终left处于的位置,即是这个目标值应该插入到这个数组的位置。(35)
  • 每次二分查找会找到数组中唯一的target值,而对于数组中target值可能有重复个时,可以通过两次二分查找(找到middle不停下,记录下这个middle,并且让right或left更新),一次不断向左,一次不断向右,就可以找到数组中等于target值的最左和最右下标。(34)

双指针方法

1. 常用于数组和链表,解决通过条件寻找新数组或链表的问题。
2. 可以分为快慢指针 和 头尾指针。
3. 时间复杂度O(n),常作为暴力解法的优化,用一个for/while来代替两个。

快慢指针

同时从起点出发,快指针负责探索并找到需要的值,需要不断前进(即for/while的值)。慢指针负责将快指针探索到的可靠值保留下来,作为新数组的尾指针。

这种方法不会改变数组中有效值的相对位置,会覆盖无效值(正常行为)。

头尾指针

一头一尾分别出发,直到相遇。头指针找不可靠值,尾指针找可靠值。每当头指针找到不可靠值,便让尾指针的值将其覆盖,然后两个指针继续朝自己的方向找到下一个符合的值。

这种方法会改变数组中有效值的相对位置(数组后半段的值到了前半段),会覆盖无效值(正常行为)。

posted @ 2024-05-22 13:54  sakilohale  阅读(186)  评论(0编辑  收藏  举报