二分查找-LeetCode

题目

给定一个 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。

首先,给出暴力解法

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        for(int i = 0;i < nums.length;i++){
        //循环nums数组,寻找target
            if(nums[i] == target){
                return i;
                //找到则返回下标,数组下标从0开始
            } 
        }
        return -1;
        //退出循环仍没有返回,则说明没有找到,则返回-1
    }
}

其次,二分法解法[i,j)

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int i = 0;
        // 初始化变量 i 为 0,i 代表当前查找范围的左边界索引
        int j = nums.length;
        // 初始化变量 j 为数组 nums 的长度,j 代表当前查找范围的右边界索引
        while(i < j){
        // 当左边界索引 i 小于右边界索引 j 时,持续循环查找
            int m = (i+j) >>>1;
            // 计算当前查找范围的中间索引 m
            // 使用无符号右移运算符 >>> 进行整除操作,确保结果为整数
            if(target > nums[m]){
                i = m+1;
                // 则将左边界索引 i 更新为 m + 1,缩小查找范围到右半部分
            }else if(target < nums[m]){
                j = m;
                // 则将右边界索引 j 更新为 m,缩小查找范围到左半部分
            }else{
                return m;
            }
        }
        return -1;
        // 若循环结束仍未找到目标值,返回 -1 表示未找到
    }
}

i,j

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int i = 0;
        // 初始化变量 i 为 0,i 代表当前查找范围的左边界索引
        int j = nums.length-1;
        // 初始化变量 j 为数组 nums 的长度,j 代表当前查找范围的右边界索引
        while(i <= j){
        // 当左边界索引 i 小于等于右边界索引 j 时,持续循环查找
            int m = (i+j) >>>1;
            // 计算当前查找范围的中间索引 m
            // 使用无符号右移运算符 >>> 进行整除操作,确保结果为整数
            if(target > nums[m]){
                i = m+1;
                // 则将左边界索引 i 更新为 m + 1,缩小查找范围到右半部分
            }else if(target < nums[m]){
                j = m-1;
                // 则将右边界索引 j 更新为 m - 1,缩小查找范围到左半部分
            }else{
                return m;
            }
        }
        return -1;
        // 若循环结束仍未找到目标值,返回 -1 表示未找到
    }
}
相关推荐
辰烨chenye4 分钟前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
lhldsg3 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都3 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒3 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb3 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术3 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
小羊没烦恼!4 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
sanjiaomao3334 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息4 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪