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

【二分查找】力扣 34. 在排序数组中查找元素的第一个和最后一个位置

一、题目

在这里插入图片描述

二、思路

将题目转化为求解 target 和 target + 1 的查找。分别采用最基础的二分查找即可。

三、题解

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int n = nums.length;
        int start = lowerBound(nums, target);
        if (start == n || nums[start] != target) {
            return new int[] {-1, -1};
        }
        // start 找到了,end 也一定存在,因此 end 无需检验
        int end = lowerBound(nums, target + 1) - 1;
        return new int[] {start, end};
    }


    /* 寻找大于等于 target 的第一个数,若存在 target 返回 left,即为第一个 target 的位置
        若有序数组中都是小于 target 的数,left 一直右移,最后 left = n,返回left,即为数组长度,tips: 返回的 left 不在下标范围内
        若有序数组中都是大于 target 的数,right 一直左移,left始终没有移动,最后 left = 0,tips: 返回的 left 在下标范围内,但所指向的数值与 target 不同
    */
    public int lowerBound(int[] nums, int target) {
        int n = nums.length;
        int left = 0, right = n - 1;
        while (left <= right) { // 区间不为空
            int mid = left + (right - left)/ 2; // java 防止溢出
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;// 最后结束时,right 在 left左边一个位置,right + 1 = left
                    // left - 1 永远指向的是红色,right + 1 永远指向的是蓝色,left的位置就是要找
    }
}

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

相关文章:

  • 鸿蒙多线程应用-taskPool
  • spark3.x之后时间格式数据偶发报错org.apache.spark.SparkUpgradeException
  • Linux中网络文件系统nfs使用
  • S4 UPA of AA :新资产会计概览
  • 如何使用PHP爬虫获取店铺详情:一篇详尽指南
  • 初识 Django
  • 2024第六次随堂测验参考答案
  • leetcode 208. 实现 Trie (前缀树)
  • pico-sdk(八)-程序架构之自定义预处理变量
  • 【opencv-python】的cv2.imdecode()与cv2.imencode()
  • 力扣--LCR 148.验证图书取出顺序
  • 二维码有哪些网络安全风险隐患?
  • 【C语言篇】探索 C 语言结构体:从基础语法到数据组织的初体验
  • 力扣,88. 合并两个有序数组
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(1))
  • 项目整合logback日志打印线程id
  • GraphRAG访问模式和知识图谱建模
  • HarmonyOS-初级(一)
  • 【ANC系统】主动噪声控制系统结构分类
  • 前端——自定义组件