二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
使用了模板3
1 | class Solution: |
搜索区间 LintCode
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
思路:
- 用模板三
- 先用二分搜索,搜第一次出现的
- 再二分搜索,搜最后一次出现的
1 | func searchRange (A []int, target int) []int { |
搜索插入位置
主要思路:
- 依旧是用模板3
- 题目其实是找第一个能插入的位置,所以有相同的值的话,需要插在这个值的第一个出现的位置
- 如果没有相同值,就按情况找start、end、end+1其中的一个返回即可
1 | class Solution: |
搜索二维矩阵
很简单的思路
- 把二维化为一维
- 再二分搜索(可以用模板1、也可以用模板3)
1 | class Solution: |
第一个错误的版本号
仍然是用模板3
1 | # The isBadVersion API is already defined for you. |
搜索旋转排序数组最小值
思路如上,主要是要用nums[end]这个分界点来做
1 | class Solution: |
搜索旋转排序数组最小值-ii(有重复元素)
比之前的题多了一个跳过重复元素的操作
while start+1<end and nums[end]==nums[end-1]: end-=1 #重点,要跳过重复的元素
while start+1<end and nums[start]==nums[start+1]: start+=1
1 | class Solution: |
搜索旋转排序数组中某个值
主要是要对两条线的,start\mid\end的四种情况有分析
- 相等直接返回
- 如果左半部分是连续的
- 如果target是在左半部分内的,往左缩圈
- 如果target不在,往右缩圈
- 如果右半部分是连续的
- 如果target是在右半部分内,往右缩圈
- 如果target不在,往左缩圈
1 | class Solution: |
搜索旋转排序数组中某个值-ii
跳过重复元素
算mid值
对两条线的,start\mid\end的四种情况有分析
1 | class Solution: |