leetcode-34.在排序数组中查找元素的第一个和最后一个位置

题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

复制代码
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

复制代码
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

复制代码
输入:nums = [], target = 0
输出:[-1,-1]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

解题思路:

特殊情况,当该元素不存在时,返回 -1,-1

1、通过JavaAPI判断元素是否存在

Arrays.binarySearch(nums,target)

  • 当元素存在 : 返回对应元素数组下标
  • 当元素不存在 : 返回对应元素数组插入点下标

2、有序数列中存在重复元素,寻找最左元素和最有元素

思路:当找到元素后,继续寻找,直到循环结束

  • 【当右指针 j 找到 , 执行 j = m - 1 , 可以找到最左target】
  • 【当左指针 i 找到 , 执行 i = m + 1 , 可以找到最右target】
java 复制代码
class Solution {
    public int[] searchRange(int[] nums, int target) {
        if(Arrays.binarySearch(nums,target) < 0) return new int[]{-1,-1};

        int i = Min(nums,target);
        int j = Max(nums,target);
        return new int[]{i , j};

    }
       public static int Max(int[] nums, int target) {
        int i = 0, j = nums.length - 1;
        while (i <= j) {
            int m = (i + j) >>> 1;
            if (nums[m] <= target) {
                i = m + 1;
            } else {
                j = m - 1;
            }
        }
        return j;
    }
    public static int Min(int[] nums, int target) {
        int i = 0, j = nums.length - 1;
        while (i <= j) {
            int m = (i + j) >>> 1;
            if (nums[m] < target) {
                i = m + 1;
            } else {
                j = m - 1;
            }
        }
        return i;
    }
}

day2

相关推荐
Nil20812 分钟前
leetcode 48旋转图像
算法·leetcode·职场和发展
嘟嘟071730 分钟前
顺时针螺旋填充 n×n 矩阵:手撕 generateMatrix 的四个 for 循环
javascript·算法·面试
Nil20830 分钟前
leetcode 206反转链表
算法·leetcode·链表
Kstheme33 分钟前
大模型内部是怎么运作的?从「一个神经元」拆到「残差流」
算法
郝学胜_神的一滴34 分钟前
并查集深度入门:从玄学抽象到 QuickFind & QuickUnion 源码实战
数据结构·算法
GeekZHR1 小时前
C语言指针2:数组名、二级指针、指针数组,一次把“指针和数组“讲透
c语言·数据结构·算法·指针
h_a_o777oah1 小时前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
JAI科研1 小时前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
还不秃顶的计科生1 小时前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
happyprince1 小时前
02-具体观 — Cordis 算法与实现剖析
算法