所有题解方法请移步 github-Leecode_summary
278 第一个错误的版本
做题吧 ☟
- 找思路 (二分法)
- 实现代码 (迭代or递归) (将n转化为list or 记录left right索引)
今日份 small Tips :
mid = left+(right-left)/2
(虽然py不需要考虑,但在C++,java中可以防止数据溢出)
扩展版本:
寻找某个值时,返回其索引
如果要求不能用内置函数的话,就直接套用这个题目,进行二分法搜索
35. 搜索插入位置
得益于278题,思路还是比较清晰的:先设定左侧下标left
、右侧下标right
,根据left
和right
计算中间下标mid
,每次根据nums[mid]
和target
大小更新left
和right
,题解中有句话我非常赞同,写二分法时应当思考:
“循环结束条件中 left 和 right 的关系,更新 left 和 right 位置时要不要加 1 减 1”
33.搜索旋转排序数组
35题中的二分法搜索适用于有序数组,本题中是旋转数组,因此需要结合首尾判断哪一部分为有序数组,以确定保留哪一部分,还是那句话: (多多思考一下 “循环结束条件中 left 和 right 的关系,更新 left 和 right 位置时要不要加 1 减 1”
81.搜索旋转排序数组II
本来可以和35相同的思路做,但是这个题又强调了数组中存在重复元素 ,哎,我看答案了…
看了一遍还是这个题解写的比较好,很好的结合了33题。
153.寻找旋转排序数组中的最小值
其实也是二分法的一种拓展,虽然可以直接min(nums)
,但既然题目要求了时间复杂度为O(logn)那就不要走内置函数拉~
我感觉我是一边跟报错一遍试出来的答案…然后看到有答案用拐点去做的,最坏情况下,当nums=[1,2,3,...,n,0]
时,时间复杂度为O(n)。