leetcode-704.二分查找

题目

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

解题策略:

在leetcode大部分情况下,数据量都是庞大的,可能遇到算法的上界,也可能遇到算法的下界。而面对大量数据时,我采用的策略是牺牲部分空间,提高算法稳定性,将下界和上界维持在中间位置。

基础二分查找:

java 复制代码
public static int search(int[] arr, target){
    int i = 0 , j = arr.length;
    while(i < j){
        int m = i + j >>> 1 //(计算机底层运算采用二进制,左移一位相当于除以2)
        if(target < arr[m]) j = m - 1;
        else if (arr[m] < target) i = m + 1;
        else retuen m;
    }
    return -1;
}

最好情况 : O(1)

最坏情况 : O(logn)

最好,最坏情况不稳定根本原因,if判断过程中,if执行次数elseif执行次数 ,并且还需要进行target相同判断!因此出现了三次判断,而计算机的 0 和 1 更喜欢 true 和 false;

平衡二分查找

1、将判断条件缩减 , 即 if 和 else

2、if 和 else 判断意义修改,只进行范围寻找,寻找包含中间位置,不在加一,减一

3、 判断意义修改,循环结束条件也得修改

4、如果找到target,不进行加一减一操作,导致死循环。设置 j - i > 1 ,作为出口

java 复制代码
class Solution {
    public int search(int[] nums, int target) {
        int i = 0 , j = nums.length;
        while(1 < j-i){
            int m = (i+j) >>> 1;
            if(target < nums[m]){
                j = m;
            }else {
                i = m;
            }
        }
        if(target == nums[i]) return i;
        return -1;
    }
}

5、target == numsm的情况只可能出现在 i - m里面,因此判读 numsi

相关推荐
aaaameliaaa20 分钟前
指针之总结
c语言·笔记·算法
宵时待雨35 分钟前
优选算法专题9:哈希表
数据结构·算法·散列表
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp1 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238561 小时前
C/C++每日一练6
c语言·c++·算法
AI小码2 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
KaMeidebaby3 小时前
卡梅德生物技术快报|bli亲和力检测gst:告别批量跑胶:BLI实时酶切监测技术加速GST融合蛋白下游流程优化
前端·网络·数据库·人工智能·算法
alphaTao3 小时前
LeetCode 每日一题 2026/7/20-2026/7/26
算法·leetcode
圣保罗的大教堂4 小时前
leetcode 3514. 不同 XOR 三元组的数目 II 中等
leetcode
青山木7 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先