算法通关村——透彻理解二分查找

1. 循环法

java 复制代码
    public static int binarySearch(int[] arr, int low, int high, int target) {
        while (low <= high) {
            // 这样写主要是避免溢出的情况,以及>>优先级小于+,避免出现死循环
            int mid = low + ((high - low) >> 1);
            if (arr[mid] == target) {
                return mid;
            } else if (arr[mid] < target) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return -1;
    }

2. 递归

java 复制代码
    public static int binarySearch1(int[] array, int low, int high, int target) {
        if (low < high) {
            int mid = low + ((high - low) >> 1);
            if (array[mid] == target) {
                return mid;
            } else if (array[mid] > target) {
                return binarySearch(array, low, mid - 1, target);
            } else {
                return binarySearch(array, mid + 1, high, target);
            }
        }
        return -1;
    }

3. 元素中有重复的二分查找

假设现在有个数组里面有重复元素,并且按照增序排列,如果有相同元素,返回最左侧的第一个重复元素的位置。

核心思路也是比较简单了,当找到第一个重复的元素时候,记录位置,然后向左移动,左边的不是目标元素,就意味着左边没有重复的目标元素,然后+1就是目标元素的位置

java 复制代码
 public static int search(int[] nums, int target) {
        if (nums == null || nums.length == 0)
            return -1;
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            int mid = low + ((high - low) >> 1);
            if (nums[mid] < target) {
                low = mid + 1;
            } else if (nums[mid] > target) {
                high = mid - 1;
            } else {
                // 找到了符合目标元素的数据位置,然后一直往左遍历,知道不是目标元素或者索引为0的时候停止
                while (mid != 0 && nums[mid] == target) {
                    mid--;
                }
                if (mid == 0 && nums[mid] == target) {
                    return mid;
                }
                return mid + 1;
            }
        }
        return -1;
    }
相关推荐
茉莉玫瑰花茶5 分钟前
C++ 17 详细特性解析(5)
开发语言·c++·算法
cpp_250117 分钟前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_250124 分钟前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
uesowys32 分钟前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
TracyCoder1231 小时前
LeetCode Hot100(26/100)——24. 两两交换链表中的节点
leetcode·链表
季明洵1 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi1 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL1 小时前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
Yeats_Liao1 小时前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
only-qi1 小时前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表