二分:查找排序数组中元素的最后一个位置

48 阅读1分钟

leetcode: 34. 在排序数组中查找元素的第一个和最后一个位置

题目描述

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

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

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例

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

解题思路

左闭右闭区间写法,定义l的左边都小于等于target,r的右边都大于target。

  • 如果nums[mid] > target,最后一个元素一定在mid左边。
  • nums[mid] < target,最后一个target元素一定在mid右边。
  • nums[mid] == target,需要找最后一个位置,可能在mid位置或者mid右边。

完整代码:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int first, last;
        last = binarySearchLastElem(nums, target);
        if (last < 0 || target != nums[last]) {
            return new int[]{-1, -1};
        }
        first = binarySearchLastElem(nums, target - 1) + 1;
        return new int[]{first, last};
    }

    int binarySearchLastElem(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (nums[mid] > target) {
                r = mid - 1;
            }
            else {
                l = mid + 1;
            }
        }
        return r;
    }
}