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

题目

给定升序数组,数组中的元素有可能会重复。给定一个 target,找出 target 在数组中的起始和末尾的下标。如果不存在则返回 [-1, -1]。

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

原题链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/

思路

升序数组的查找,依然是二分法。只不过这里需要查找两次target,且增加一个条件。一次是满足 x[i-1]

  • 复杂度分析
    • 时间复杂度 O(logn)。两次二分,依然是O(logn)。
    • 空间复杂度 O(1)。

代码

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftIndex = binarySearch(nums, target, true);
        int rightIndex = binarySearch(nums, target, false);
        return {leftIndex, rightIndex};
    }
    int binarySearch(vector<int>&nums, int target, bool lower) {
        int left = 0;
        int right = nums.size() - 1;
        while (left <= right) {
            int mid = (right - left) * 0.5 + left;
            if (nums[mid] == target) {
                if (lower) {
                    if (mid == 0 || nums[mid] > nums[mid - 1]) {
                        return mid;
                    }
                    else {
                        right = mid - 1;
                    }
                }
                else {
                    if (mid == nums.size() - 1 || nums[mid] < nums[mid + 1]) {
                        return mid;
                    }
                    else {
                        left = mid + 1;
                    }
                }        
            }
            else if (nums[mid] < target) {
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }
        return -1;
    }
};

你可能感兴趣的:(LeetCode,leetcode,排序算法,算法)