美文网首页
34. 在排序数组中查找元素的第一个和最后一个位置

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

作者: Abeants | 来源:发表于2022-05-26 19:32 被阅读0次

    给定一个按照升序排列的整数数组 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

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路及方法

    O(n)很简单,一次遍历即可,直接看进阶。
    类似于33. 搜索旋转排序数组,要求 O(log n),直接二分。在找到target的时候,向左右寻找其边界,同时注意下标不能越界。

    class Solution {
        public int[] searchRange(int[] nums, int target) {
            int n = nums.length;
            if (n == 0) return new int[]{-1, -1};
            if (n == 1) return nums[0] == target ? new int[]{0, 0} : new int[]{-1, -1};
    
            int left = 0, right = n - 1;
            while (left <= right) {
                int mid = left + (right - left) / 2;
                // 找到target并寻找其左右边界
                if (nums[mid] == target) {
                    int l = mid, r = mid;
                    // 寻找左边界
                    while (l - 1 >= 0 && nums[l - 1] == target) l--;
                    // 寻找右边界
                    while (r + 1 <= n - 1 && nums[r + 1] == target) r++;
                    return new int[]{l, r};
                }
                if (nums[mid] > target) right = mid - 1;
                if (nums[mid] < target) left = mid + 1;
            }
    
            return new int[]{-1, -1};
        }
    }
    

    结果如下:

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/kvkpprtx.html