📌  相关文章
📜  在有序数组中查找元素的第一个和最后一个位置 - Java (1)

📅  最后修改于: 2023-12-03 14:51:28.599000             🧑  作者: Mango

在有序数组中查找元素的第一个和最后一个位置 - Java

在有序数组中查找指定元素的第一个和最后一个位置是一个常见的问题。如果使用简单的线性搜索方法,时间复杂度为O(n),从而无法达到最优解。在本文中,我们将介绍一种用Java语言实现的更加高效的解决方案。

解决方案

为了达到最优解,我们可以使用二分查找算法。具体来说,我们可以使用两次二分查找,一次查找第一个出现的位置,一次查找最后一个出现的位置。以下是实现的Java代码:

public class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = {-1, -1};
        if (nums == null || nums.length == 0) return res;
        res[0] = findFirst(nums, target);
        res[1] = findLast(nums, target);
        return res;
    }
    
    private int findFirst(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] < target) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        if (nums[l] != target) return -1;
        return l;
    }
    
    private int findLast(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int mid = l + (r - l + 1) / 2;
            if (nums[mid] > target) {
                r = mid - 1;
            } else {
                l = mid;
            }
        }
        if (nums[l] != target) return -1;
        return l;
    }
}

这个代码中,我们首先判断数组是否为空,然后分别调用findFirstfindLast函数查找第一个和最后一个出现的位置。findFirst的实现是基于标准的二分查找算法。我们将查找范围缩小到左侧,并在每次迭代中检查中间元素是否是我们要找的元素。如果是,我们继续在左侧查找,否则我们移动右指针。findLast的实现类似,但是在查找范围缩小到右侧。

总结

在有序数组中查找指定元素的第一个和最后一个位置是一个经典问题。通过使用二分查找算法,我们可以实现更加高效的解决方案。在实现过程中,我们需要实现两个二分查找函数,并在每个函数中处理边界情况。这个问题也可以解决其他语言,如C++或Python。