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]

相关推荐
shymoy34 分钟前
Radix Sorts
数据结构·算法·排序算法
风影小子43 分钟前
注册登录学生管理系统小项目
算法
黑龙江亿林等保1 小时前
深入探索哈尔滨二级等保下的负载均衡SLB及其核心算法
运维·算法·负载均衡
起名字真南1 小时前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
lucy153027510791 小时前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
杜杜的man1 小时前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
小沈熬夜秃头中୧⍤⃝1 小时前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
木向2 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越2 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
skaiuijing2 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核