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 == nums[m]的情况只可能出现在 i - m里面,因此判读 nums[i]

相关推荐
程序媛小盐20 分钟前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle23 分钟前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
c6lala33 分钟前
数据结构day1
数据结构
多多*39 分钟前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
逐光沧海39 分钟前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
Kidddddult41 分钟前
力扣刷题Day 48:盛最多水的容器(283)
算法·leetcode·力扣
AndrewHZ1 小时前
【Python生活】如何构建一个跌倒检测的算法?
python·算法·生活·可视化分析·陀螺仪·加速度计·跌倒检测
写个博客1 小时前
代码随想录算法训练营第三十九天
算法
源码方舟2 小时前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
fancy1661663 小时前
力扣top100 矩阵置零
人工智能·算法·矩阵