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

 代码:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        int beginPos = 0, endPos = 0; //beginPos和endPos为目标值在数组中的起始位置和结束位置的索引
        int flag = 0; //记录数组中是否存在要查找的值
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (target > nums[mid]) {
                left = mid + 1;
            }
            else if (target < nums[mid]) {
                right = mid - 1;
            }
            else {
                if (mid == 0 || nums[mid -1] < target) {
                    beginPos = mid;
                    flag = 1; //查到了,更新flag
                    break;
                }
                right = mid - 1;
            } 
        } if (flag) { //数组中有目标值则执行下列代码找结束位置
            left = 0;
            right = nums.size() - 1;
            while (left <= right) {
                int mid = left + (right - left) / 2;
                if (target > nums[mid]) {
                    left = mid + 1;
                }
                else if (target < nums[mid]) {
                    right = mid - 1;
                }
                else {
                    if (mid == nums.size() - 1 || nums[mid + 1] > target) {
                        endPos = mid;
                        break;
                    }
                    left = mid + 1;
                } 
            } 
        }if (flag) { //数组中有目标值
            vector<int> v1 = {beginPos, endPos};
            return v1;
        }
        else { //数组中不存在目标值
            vector<int> v2 = {-1, -1};
            return v2;
        }
    }
};

 思路:

1. 如果target在数组中,找开始位置和结束位置,等价于在数组中查找第一个与target相等的元素和最后一个与target相等的元素,并记录索引。

2. 查找第一个与target相等的元素:(mid - 1) 位置的值小于target,如果mid是第一个元素,(mid - 1) 就越界了,所以要判断mid == 0,注意短路原则。

3. 查找最后一个与target相等的元素:(mid + 1) 位置的值大于target,如果mid是最后一个元素,(mid + 1) 就越界了,所以要判断mid == (元素个数 - 1)。

4. 如果数组中没有目标值,查找第一个与target相等的元素时会退出循环。如果数组中有目标值,查找并记录了第一个与target相等的元素的索引beginPos,退出循环。为了区分是哪种情况,设置一个flag = 0。如果数组中有目标值,记录了起始位置索引beginPos后,将flag置为1。之后如果flag 为1,则表明数组中有目标值,可以继续查找最后一个与target相等的元素并记录结束位置索引endPos。如果flag 为0,则数组中没有目标值,就不需要继续查找了。

 

posted @ 2023-05-13 15:08  创造一个有琳的世界  阅读(24)  评论(0)    收藏  举报