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

相关推荐
焦耳加热16 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn16 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u60617 小时前
常用排序算法核心知识点梳理
算法·排序
蒋星熠19 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油19 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream20 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL20 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
空白到白20 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类
索迪迈科技20 小时前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
zzzsde21 小时前
【数据结构】队列
数据结构·算法