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

相关推荐
随意起个昵称几秒前
【二分】洛谷P2920,P2985做题小记
c++·算法
没书读了6 分钟前
计算机组成原理-考前记忆清单
线性代数·算法
Hcoco_me34 分钟前
大模型面试题5:矩阵(M*M)特征值分解的步骤
算法·机器学习·矩阵
非著名架构师1 小时前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测
星轨初途1 小时前
数据结构排序算法详解(2)——选择排序(附动图)
c语言·数据结构·经验分享·笔记·b树·算法·排序算法
kaikaile19952 小时前
基于 MATLAB 的室内三维定位
算法
AGI前沿3 小时前
AdamW的继任者?AdamHD让LLM训练提速15%,性能提升4.7%,显存再省30%
人工智能·算法·语言模型·aigc
Tan_Ying_Y3 小时前
什么是垃圾回收算法 他的底层原理是什么?
算法
Xの哲學3 小时前
Linux 分区表深度技术剖析
linux·网络·算法·架构·边缘计算
写写闲篇儿3 小时前
经典算法题剖析之传递信息(三)
算法