当前位置: 首页 > article >正文

二分查找------查找区间

1. 题目

在这里插入图片描述

2. 思路和题解

这道题虽然是道中等题,并且看起来很复杂,但是实际上就是给定一个数组和目标值,让我们去寻找该目标值在数组中的位置。题目还提到说设计O(log n)的算法解决问题,更进一步暗示我们去用二分查找。要找开始位置和结束位置,那就分两步:

  1. 寻找开始位置
while (left <= right) {
    int mid = left + (right - left) / 2;
    if (nums[mid] == target) {
        arr[0] = mid; //找到目标值后,将下标赋值给数组第一个元素
        right = mid - 1; // 这一步很重要,是为了寻找在这之前,是否还存在目标值
    } else if (nums[mid] < target){
        left = mid + 1;
    } else {
        right = mid - 1;
    }
}
  1. 寻找结束位置
while (left <= right) {
    int mid = left + (right - left) / 2;
    if (nums[mid] == target) {
        arr[1] = mid;
        left = mid + 1; //这一步和上面一样也很重要,是为了确定在这之后,是否还存在目标值
    } else if (nums[mid] < target){
        left = mid + 1;
    } else {
        right = mid - 1;
    }
}

所以整体代码如下

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int[] arr = {-1, -1};
        //第一次查找
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                arr[0] = mid;
                right = mid - 1;
            } else if (nums[mid] < target){
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        //第二次查找
        left = 0;
        right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                arr[1] = mid;
                left = mid + 1;
            } else if (nums[mid] < target){
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return arr;
    }
}

http://www.kler.cn/a/593745.html

相关文章:

  • AI全天候智能助手,为您构建私人数据库
  • 达芬奇预设:创意现代抽象动态海报活力动态文字标题排版设计视觉预设 MotionVFX – mTitle Hype DVR
  • VLLM专题(三十九)—自动前缀缓存(二)
  • linux性能监控的分布式集群 prometheus + grafana 监控体系搭建
  • 让vscode远程开发也可以图形显示
  • nuxt项目 详情页有阅读次数需要更新,有热门推荐列表需要更新适合做SSG吗
  • 【C++指南】string(三):basic_string底层原理与模拟实现详解
  • 【MyDB】6-TabelManager 字段与表管理 之1-TBM实现思路概览
  • 江小南的题目讲解
  • Vala编程语言教程-语言元素
  • 轮足式机器人运动控制系统设计(大纲)
  • 过程监控——lsof
  • DeepSeek(8):结合Kimi-PPT助手一键生成演示报告
  • 【智能体】| 知识库、RAG概念区分以及智能体是什么
  • Steam游戏实时数据获取API集成文档
  • 从两指到三指:Robotiq机器人自适应夹持器技术解析
  • 将COCO格式的物体检测数据集划分训练集、验证集和测试集
  • Word 小黑第34套
  • 在C语言基础上学Java【Java】【一】
  • 自然语言处理(Natural Language Processing,NLP)入门教程