LeetCode:704. 二分查找

简介

题目链接:https://leetcode.cn/problems/binary-search/description/

解决方式:数组 + 二分查找

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

二分查找系列题:

  1. 在排序数组中查找元素的第一个和最后一个位置(进阶)

二分查找

思路:题目所给数组是升序的,所以我们可以初始化两个左右指针,分别指向第一个和最后一个元素。每次迭代的时候先计算中间点,根据中间点判断向何处收缩区间。

具体可参考labuladong大佬关于二分查找一系列的详细题解!

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        // 左右边界
        int left = 0;
        int right = nums.length - 1;
        // 二分查找
        while(left <= right){
            // 中点
            // 由数学公式 (left + right) / 2 等价而来,防止整数溢出
            int mid = left + (right - left) / 2;
            if(nums[mid] > target){
                // 目标在左侧,向左收缩
                right = mid - 1;
            }else if(nums[mid] < target){
                // 目标在右侧,向右收缩
                left = mid + 1;
            }else{
                // 中点元素就是目标元素,直接返回
                // 由于此题找到即可,而不是寻找左右边界,所以直接返回
                return mid;
            }
        }
        // 没有找到,返回 -1
        return -1;
    }
}

拓展

寻找左边界

思路:为了寻找左边界,中间点等于目标元素时不能直接返回,而是进一步向左收缩,减小范围,直到找到左边界。

java 复制代码
int left_bound(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if (nums[mid] == target) {
            // 别返回,进一步减小范围
            right = mid - 1;
        }
    }
    // 检查 left 越界的情况
    // 一种是目标元素比数组所有元素都大,left = nums.length
    // 一种是目标元素在数组范围中,但是没有目标元素
    if (left >= nums.length || nums[left] != target)
        return -1;
    return left;
}

寻找右边界

思路:与寻找右边界同理。

java 复制代码
int right_bound(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else if (nums[mid] == target) {
            // 别返回,进一步减少范围
            left = mid + 1;
        }
    }
    // 检查 right 越界的情况
    // 一种是目标元素比数组所有元素都小,right < 0
    // 一种是目标元素在数组范围中,但是没有目标元素
    if (right < 0 || nums[right] != target)
        return -1;
    return right;
}
相关推荐
Navigator_Z3 小时前
LeetCode //C - 1089. Duplicate Zeros
c语言·算法·leetcode
云泽8085 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
wlsh156 小时前
Go 迭代器
算法
语戚6 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
天天进步20156 小时前
Python全栈项目实战:从零构建校园心理健康咨询平台
面试·职场和发展
CS创新实验室7 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
Black蜡笔小新7 小时前
自动化AI算法训练服务器DLTM训推一体化平台助力农业生产管理实现安全智能化
人工智能·算法·自动化
武子康8 小时前
调查研究-151 Slack vs Jira:区别、使用指南与团队选择方法
人工智能·科技·深度学习·ai·职场和发展·jira·slack
8Qi88 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS9 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源