【LeetCode精选算法】二分查找专题二

目录

[1. 山峰数组的峰顶](#1. 山峰数组的峰顶)

[2. 寻找峰值](#2. 寻找峰值)

[3. 搜索旋转排序数组中的最小值](#3. 搜索旋转排序数组中的最小值)

[4. 0~n-1 中缺失的数字](#4. 0~n-1 中缺失的数字)


1. 山峰数组的峰顶

题目链接 :852. 山脉数组的峰顶索引
解题思路:

  • 使用二分查找,找到满足 arr[mid] > arr[mid - 1] 的最后一个位置。

  • 如果 arr[mid] > arr[mid - 1],说明还在上升阶段,答案在 [mid, right]。

  • 否则说明已经过了峰顶,答案在 [left, mid - 1]。

  • 最后返回 left。

Java 代码:

java 复制代码
class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 1, right = arr.length - 2;
        while (left < right) {
            int mid = left + (right - left + 1) / 2;
            if (arr[mid] > arr[mid - 1]) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }
}

2. 寻找峰值

题目链接 :162. 寻找峰值
解题思路:

  • 利用"任意相邻元素不相等"和"两端视为负无穷"的条件。

  • 比较 arr[mid] 与 arr[mid + 1]:

    • 如果 arr[mid] < arr[mid + 1],说明右侧存在峰值,left = mid + 1。

    • 否则说明左侧存在峰值,right = mid。

  • 最终返回 left。

Java 代码:

java 复制代码
class Solution {
    public int findPeakElement(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[mid + 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
}

3. 搜索旋转排序数组中的最小值

题目链接 :153. 寻找旋转排序数组中的最小值
解题思路:

  • 将数组最后一个元素 x 作为参照点。

  • 比较 nums[mid] 与 x:

    • 如果 nums[mid] > x,说明 mid 在旋转点左侧,最小值在右侧,left = mid + 1。

    • 否则说明 mid 在旋转点右侧或就是最小值,right = mid。

  • 最后返回 nums[left]。

Java 代码:

java 复制代码
class Solution {
    public int findMin(int[] nums) {
        int left = 0, right = nums.length - 1;
        int x = nums[right];
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] > x) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return nums[left];
    }
}

4. 0~n-1 中缺失的数字

题目链接 :剑指 Offer 53-II. 0~n-1中缺失的数字
解题思路:

  • 在缺失位置之前,nums[i] == i;之后,nums[i] != i。

  • 比较 nums[mid] 与 mid:

    • 如果 nums[mid] == mid,说明缺失位置在右侧,left = mid + 1。

    • 否则说明缺失位置在左侧或当前位置,right = mid。

  • 最后判断 nums[left] 是否等于 left,决定返回 left + 1 还是 left。

Java 代码:

java 复制代码
class Solution {
    public int missingNumber(int[] nums) {
        int left = 0, right = nums.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == mid) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return nums[left] == left ? left + 1 : left;
    }
}
相关推荐
葫三生40 分钟前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle40 分钟前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法
avi911142 分钟前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
淡海水1 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc
碧海银沙音频科技研究院1 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法
青春不朽5121 小时前
Python 的 list append 为什么是均摊 O(1)?拆开过度分配那张表,看容量翻倍背后的暗账
java·python·list
云淡风轻~窗明几净1 小时前
角谷猜想与百度AI的对话dialog(原始稿)
人工智能·算法·机器学习·图论
小羊没烦恼!2 小时前
.NET 11 Runtime Async 详解
java·运维·开发语言·javascript·python
哇嘎呀2 小时前
RHCSA题目
java·服务器·前端
SL_staff2 小时前
企业知识平台细粒度权限设计实践:从成员组、文档库到操作级的三层防线
java·开源·全栈