算法挑战 - Day1 - 704 二分查找

73 阅读1分钟

题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

 

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

题解

难点

1、如何确定 while 循环的时候 left 与 right 是 < 还是 <=

2、如何确定 left 与 right 与 mid 直接的关系

这个主要是根据 我们是如何取 left 与 right 这两个值的

如果 left 与 right 是 左闭右闭区间 [left,right]

则代码如下:

func search(_ nums: [Int], _ target: Int) -> Int {
        var left = 0 ,right = nums.count-1
        // 因为是左闭 右闭 所以这里是 left<=right 是合法的
        while left <= right {
            let mid = left + (right-left)/2
            if nums[mid] > target {
                // 因为是左闭 右闭 所以此时 mid 已经确认不满足条件了
                right = mid-1
            } else if nums[mid] < target {
                left = mid+1
            } else {
                return mid
            }
        }
        return -1
}

如果 left 与 right 是 左闭右开区间 [left,right) 则代码如下

func search(_ nums: [Int], _ target: Int) -> Int {
        var left = 0 ,right = nums.count
        // 因为是左闭 右开 所以这里是 left<right 是合法的
        while left < right {
            let mid = left + (right-left)/2
            if nums[mid] > target {
                // 因为是左闭 右开 所以此时 right = mid 是合法的 满足  左闭 右开
                right = mid
            } else if nums[mid] < target {
                left = mid+1
            } else {
                return mid
            }
        }
        return -1
    }