34、在排序数组中查找数字的第一个位置和最后一个位置

  1. 34、在排序数组中查找数字的第一个位置和最后一个位置
    1. 示例 1:
    2. 示例 2:
  2. 解题思路
  3. java代码

34、在排序数组中查找数字的第一个位置和最后一个位置

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

你的算法时间复杂度必须是 O(log n) 级别。

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

示例 1:

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

示例 2:

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

解题思路

  • 二分查找的应用
  • 在找到元素时,进一步判断是否是第一个

java代码

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = new int[2];
        res[0] = findFirst(nums,target);
        if (res[0] == -1) res[1] = -1;
        else res[1] = findLast(nums,target,res[0]);
        return res;
    }
    private int findFirst(int[] nums,int target){
        int l = 0;
        int r = nums.length - 1;
        while (l <= r) {
            int mid = (l + r + 1) >> 1;
            if (nums[mid] == target) { // 找到第一个数字
                if ((mid > 0 && nums[mid - 1] != target) || mid == 0) return mid;
                else r = mid - 1;
            } else if (nums[mid] > target) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return -1;
    }
    
    private int findLast(int[] nums,int target,int first) {
        int l = first;
        int len = nums.length;
        int r = len - 1;
        while (l <= r) {
            int mid = (l + r + 1) >> 1;
            if (nums[mid] == target) {
                if (mid == len - 1 || (mid < len - 1  && nums[mid + 1] != target)) return mid;
                else l = mid + 1;
            } else if (nums[mid] > target) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return -1;
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:34、在排序数组中查找数字的第一个位置和最后一个位置

Count:368

Author:攀登

Created At:2020-07-26, 00:19:44

Updated At:2024-06-15, 15:52:32

Url:http://jiafeimao-gjf.github.io/2020/07/26/34%E3%80%81%E5%9C%A8%E6%8E%92%E5%BA%8F%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%95%B0%E5%AD%97%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E4%BD%8D%E7%BD%AE%E5%92%8C%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E4%BD%8D%E7%BD%AE/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation