LeetCode.704 二分查找

127 阅读2分钟

这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战

题目描述:

599. 两个列表的最小索引总和 - 力扣(LeetCode) (leetcode-cn.com)

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

示例一

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

示例二

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

提示:

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

思路分析

二分查找

有序数组,找某个数,这应该算是非常标准的二分查找了。

二分法的一般过程就是

  1. 设定查找区间
  2. 取中值,并与我们的target作比较
  3. 根据比较结果,移动指针

二分查找现在基本都是很成熟的解法了,同时也有多种模板,如果熟练的话可以直接套用。

二分查找的难点就是要注意下 循环条件 以及 加一减一 上。

AC代码

class Solution {
    fun search(nums: IntArray, target: Int): Int {
        var left = 0
        var right = nums.size
        while (left < right) {
            val mid = ((right - left) ushr 1) + left
            when {
                target == nums[mid] -> return mid
                target < nums[mid] -> right = mid
                else -> left = mid + 1
            }
        }
        return -1
    }
}

总结

二分法不难,难的就是边界情况等,我觉得这个老哥讲的非常详细,大家可以看看。

参考

二分查找 - 二分查找 - 力扣(LeetCode) (leetcode-cn.com)

画解算法:704. 二分查找 - 二分查找 - 力扣(LeetCode) (leetcode-cn.com)

二分查找细节详解,顺便赋诗一首 - 二分查找 - 力扣(LeetCode) (leetcode-cn.com)