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

相关推荐
2401_841495642 小时前
【数据结构】红黑树的基本操作
java·数据结构·c++·python·算法·红黑树·二叉搜索树
西猫雷婶2 小时前
random.shuffle()函数随机打乱数据
开发语言·pytorch·python·学习·算法·线性回归·numpy
小李独爱秋3 小时前
机器学习中的聚类理论与K-means算法详解
人工智能·算法·机器学习·支持向量机·kmeans·聚类
小欣加油5 小时前
leetcode 1863 找出所有子集的异或总和再求和
c++·算法·leetcode·职场和发展·深度优先
C++chaofan5 小时前
项目中为AI添加对话记忆
java·数据结构·人工智能·redis·缓存·个人开发·caffeine
十八岁讨厌编程5 小时前
【算法训练营Day27】动态规划part3
算法·动态规划
炬火初现6 小时前
Hot100-哈希,双指针
算法·哈希算法·散列表
weixin_307779136 小时前
利用复变函数方法计算常见函数的傅里叶变换
算法
共享家95277 小时前
LeetCode热题100(1-7)
算法·leetcode·职场和发展
失散138 小时前
软件设计师——03 数据结构(下)
数据结构·软考·图论·软件设计师