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

相关推荐
luthane2 小时前
python 实现average mean平均数算法
开发语言·python·算法
静心问道2 小时前
WGAN算法
深度学习·算法·机器学习
杰九3 小时前
【算法题】46. 全排列-力扣(LeetCode)
算法·leetcode·深度优先·剪枝
manba_3 小时前
leetcode-560. 和为 K 的子数组
数据结构·算法·leetcode
liuyang-neu3 小时前
力扣 11.盛最多水的容器
算法·leetcode·职场和发展
忍界英雄3 小时前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Kenneth風车3 小时前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
C7211BA3 小时前
使用knn算法对iris数据集进行分类
算法·分类·数据挖掘
Tisfy4 小时前
LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
算法·leetcode·机器人·题解·滑动窗口
.普通人4 小时前
c语言--力扣简单题目(回文链表)讲解
c语言·leetcode·链表