35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。 shopee考过
//二分法,时间Ologn,空间O1
func searchInsert(nums []int, target int) int {
//因为存在一种情况是 target 大于数组中的所有数,此时需要插入到数组长度的位置
n := len(nums) //res 初值设置为数组长度可以省略边界条件的判断
left, right := 0, n - 1
res := n
for left <= right {
mid := left + (right - left) >> 1
if target <= nums[mid] {
res = mid //始终保持res是最大值的索引
right = mid - 1
} else {
left = mid + 1
}
}
return res //等价于寻找 在一个有序数组中找第一个大于等于 target 的下标
}
278. 第一个错误的版本
假设你有 n
个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
输入:n = 5, bad = 4
输出:4
解释:调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true所以,4 是第一个错误的版本。
//二分法,时间Ologn,空间O1
func firstBadVersion(n int) int {
//因为存在一种情况是 target 大于数组中的所有数,此时需要插入到数组长度的位置
//n := len(n) //res 初值设置为数组长度可以省略边界条件的判断
left, right := 1, n
res := n
for left <= right {
mid := left + (right - left) >> 1
if isBadVersion(mid) { //判断二分的条件
res = mid //始终保持res是最大值的索引
right = mid - 1
} else {
left = mid + 1
}
}
return res //等价于寻找 在一个有序数组中找第一个大于等于 target 的下标
}
374. 猜数字大小
猜数字游戏的规则如下:
- 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
- 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
//二分法,时间Ologn,空间O1
func guessNumber(n int) int {
//因为存在一种情况是 target 大于数组中的所有数,此时需要插入到数组长度的位置
//nn := len(n) //ans 初值设置为数组长度可以省略边界条件的判断
left, right := 1, n
res := n
for left <= right {
mid := left + (right - left) >> 1
if guess(mid) <= 0 { //判断二分的条件
res = mid //始终保持res是最大值的索引
right = mid - 1
} else {
left = mid + 1
}
}
return res //等价于寻找 在一个有序数组中找第一个大于等于 target 的下标
}