35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。 shopee考过

  1. //二分法,时间Ologn,空间O1
  2. func searchInsert(nums []int, target int) int {
  3. //因为存在一种情况是 target 大于数组中的所有数,此时需要插入到数组长度的位置
  4. n := len(nums) //res 初值设置为数组长度可以省略边界条件的判断
  5. left, right := 0, n - 1
  6. res := n
  7. for left <= right {
  8. mid := left + (right - left) >> 1
  9. if target <= nums[mid] {
  10. res = mid //始终保持res是最大值的索引
  11. right = mid - 1
  12. } else {
  13. left = mid + 1
  14. }
  15. }
  16. return res //等价于寻找 在一个有序数组中找第一个大于等于 target 的下标
  17. }

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. 猜数字大小

猜数字游戏的规则如下:

  • 每轮游戏,我都会从 1n 随机选择一个数字。 请你猜选出的是哪个数字。
  • 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
//二分法,时间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 的下标
}