LeetCode 704. Binary Search

这篇博客详细介绍了如何实现二分查找算法,并对比了不同取整方式下的实现细节。作者分享了对于二分查找的理解,包括在有序数组中搜索目标值时的边界条件处理。同时,还提及了自己独立完成的插入数字找index版本的二分查找,讨论了可能出现的溢出情况及其解决方案。

题目:

Given a sorted (in ascending order) integer array nums of n elements and a target value, write a function to search target in nums. If target exists, then return its index, otherwise return -1.


Example 1:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4

Example 2:

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1

Note:

  1. You may assume that all elements in nums are unique.
  2. n will be in the range [1, 10000].
  3. The value of each element in nums will be in the range [-9999, 9999].

真·vanilla binary search,没啥好说的了,就直接写了。

Runtime: 0 ms, faster than 100.00% of Java online submissions for Binary Search.

Memory Usage: 39.7 MB, less than 6.60% of Java online submissions for Binary Search.

class Solution {
    public int search(int[] nums, int target) {
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (target > nums[mid]) {
                low = mid + 1;
            } else if (target < nums[mid]) {
                high = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
}

2022.11.5

还是看了一下discussion高票的binary search 101,大概搞明白了一点东西。Loading...

之前一直喜欢用while (low <= high) 配上大于小于等于三种情况分别对应+1 -1 return,因为这样比较清晰。看了这篇101大概知道了只写两个条件的怎么记住如何+1 -1对应。

首先是采用两种情况的话,while里写的就是low < high,因为最后的退出条件是low == high,此时的这个元素就是我们要求的。接下来是对mid的讨论:

1. 如果mid = (high - low) / 2,向下取整,那么此时需要分类的情况就是target < mid时,high = mid - 1,其他情况就是low = mid,还是需要把mid考虑进来。想这个的时候可以就拿两个元素时想,如果向下取整,mid = 0,target = 0 which is mid的话是不会进入这个if的,进入else了以后应该把low更新成mid,这样下次low == high就退出循环了。

2. 同理,如果mid = (high - low + 1) / 2,向上取整,分类条件就是target > mid,low = mid + 1;其他情况high = mid。

但是这么做真的容易出错啊,还是三个分类条件和low <= high最安全稳妥了!


2023.8.30

历尽千辛万苦凭借一己之力居然写出来了插入数字找index的版本……也是用的low <= high的分类方式,居然给自己整出来了,啊,赶紧记录一下!

就还是类似的分类方式,if条件也一样。最后low和high的位置其实就是这个数字应该插入的地方,排列顺序应该是这样的:high, num, low。

需要注意的是,可能会出现high  == -1或者low == nums.length的溢出情况,如果high都到-1了那就说明num应该插在最前面,如果low都超出数组范围了那就说明num应该插在最后面。下面的代码没有经过验证,但我感觉high + 1应该就能概括上述的所有情况。

class Solution {
    public int getIndex(int[] nums, int target) {
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (target > nums[mid]) {
                low = mid + 1;
            } else if (target < nums[mid]) {
                high = mid - 1;
            } else {
                return mid;
            }
        }
        return high + 1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值