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

题目描述

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

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

题目分析

两次二分查找。
查找 first 时,找到目标值后让 right = mid – 1;
查找 last 时,找到目标值后让 left = mid + 1;

Java

public int[] searchRange(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    int first = -1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else {
            first = mid;
            right = mid - 1;
        }
    }

    int last = -1;
    left = 0;
    right = nums.length - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else {
            last = mid;
            left = mid + 1;
        }
    }

    return new int[]{first, last};
}

Kotlin

fun searchRange(nums: IntArray, target: Int): IntArray {
    var first = -1
    var left = 0
    var right = nums.size - 1
    while (left <= right) {
        val mid = (left + right) / 2
        if (nums[mid] < target) {
            left = mid + 1
        } else if (nums[mid] > target) {
            right = mid - 1
        } else {
            first = mid
            right = mid - 1
        }
    }

    var last = -1
    left = 0
    right = nums.size - 1
    while (left <= right) {
        val mid = (left + right) / 2
        if (nums[mid] < target) {
            left = mid + 1
        } else if (nums[mid] > target) {
            right = mid - 1
        } else {
            last = mid
            left = mid + 1
        }
    }

    return intArrayOf(first, last)
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部