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

1.题目

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

给你一个按照非递减顺序排列的整数数组 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]

2.代码及解析

class Solution {

public:

    vector searchRange(vector& nums, int target) {

             int left = findLeft(nums, target);

        // 查找结束位置

        int right = findRight(nums, target);

       

        // 如果未找到 target,返回 [-1, -1]

        if (left == -1 || right == -1) {

            return {-1, -1};

        }

        return {left, right};

    }

private:

    // 查找第一个等于 target 的位置

    int findLeft(vector& nums, int target) {

        int left = 0, right = nums.size() - 1;

        int result = -1;

        while (left <= right) {

            int mid = left + (right - left) / 2;

            if (nums[mid] >= target) {

这里和普通的条件不一样的 正常搜索是 等于就可以 我们写的大于等于 因为我们要找最小值

所以等于了也要继续找

                right = mid - 1;  // 继续向左搜索

                if (nums[mid] == target) {

                    result = mid;  // 更新结果

                }

            } else {

                left = mid + 1;

            }

        }

        return result;

    }

    // 查找最后一个等于 target 的位置

    int findRight(vector& nums, int target) {

        int left = 0, right = nums.size() - 1;

        int result = -1;

       

        while (left <= right) {

            int mid = left + (right - left) / 2;

            if (nums[mid] <= target) {

同理 

                left = mid + 1;  // 继续向右搜索

                if (nums[mid] == target) {

                    result = mid;  // 更新结果

                }

            } else {

                right = mid - 1;

            }

        }

        return result;

    }

};

你可能感兴趣的:(leetcode,算法,数据结构)