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]

相关推荐
春日见12 分钟前
丝滑快速拓展随机树 S-RRT(Smoothly RRT)算法核心原理与完整流程
人工智能·算法·机器学习·路径规划算法·s-rrt
Code小翊12 分钟前
”回调“高级
算法·青少年编程
云里雾里!18 分钟前
力扣 977. 有序数组的平方:双指针法的优雅解法
算法·leetcode·职场和发展
一只侯子3 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉
jianqiang.xue3 小时前
别把 Scratch 当 “动画玩具”!图形化编程是算法思维的最佳启蒙
人工智能·算法·青少年编程·机器人·少儿编程
不许哈哈哈4 小时前
Python数据结构
数据结构·算法·排序算法
J***79395 小时前
后端在分布式系统中的数据分片
算法·哈希算法
Dream it possible!6 小时前
LeetCode 面试经典 150_二叉搜索树_二叉搜索树中第 K 小的元素(86_230_C++_中等)
c++·leetcode·面试
sin_hielo6 小时前
leetcode 2872
数据结构·算法·leetcode
dragoooon346 小时前
[优选算法专题八.分治-归并 ——NO.49 翻转对]
算法