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

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;
    }
相关推荐
苏小瀚17 分钟前
[数据结构] 排序
数据结构
纪元A梦2 小时前
贪心算法应用:K-Means++初始化详解
算法·贪心算法·kmeans
_不会dp不改名_2 小时前
leetcode_21 合并两个有序链表
算法·leetcode·链表
mark-puls2 小时前
C语言打印爱心
c语言·开发语言·算法
Python技术极客2 小时前
将 Python 应用打包成 exe 软件,仅需一行代码搞定!
算法
吃着火锅x唱着歌2 小时前
LeetCode 3302.字典序最小的合法序列
leetcode
睡不醒的kun2 小时前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌2 小时前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long3 小时前
【数据结构】深入理解堆:概念、应用与实现
数据结构
IAtlantiscsdn3 小时前
Redis7底层数据结构解析
前端·数据结构·bootstrap