84.在排序数组中查找元素的第一个和最后一个位置(力扣)

目录

问题描述

代码解决以及思想 

知识点 


问题描述

84.在排序数组中查找元素的第一个和最后一个位置(力扣)_第1张图片

代码解决以及思想 

class Solution {
public:
    vector searchRange(vector& nums, int target) {
        int left = 0;                      // 定义左边界
        int right = nums.size() - 1;       // 定义右边界

        while (left <= right) {            // 当左边界小于或等于右边界时,执行循环
            int middle = left + (right - left) / 2;  // 计算中间位置,避免整数溢出

            if (nums[middle] == target) {   // 如果中间元素等于目标
                int start = middle;         // 初始化起始和结束索引为中间索引
                int end = middle;

                // 向左搜索边界
                while (start > 0 && nums[start - 1] == target) {
                    start--;  // 向左移动起始索引,直到不再与目标相等
                }

                // 向右搜索边界
                while (end < (nums.size() - 1) && nums[end + 1] == target) {
                    end++;    // 向右移动结束索引,直到不再与目标相等
                }
                return {start, end};  // 返回搜索到的左右边界
            }
            else if (nums[middle] > target) {
                right = middle - 1;        // 目标在左半部分,更新右边界
            }
            else {
                left = middle + 1;         // 目标在右半部分,更新左边界
            }
        }

        return {-1, -1};  // 如果未找到目标元素,返回{-1, -1}表示未找到
    }
};
  1. 初始化左边界 left 为数组的起始位置(0),右边界 right 为数组的结束位置(nums.size() - 1)。

  2. 进入一个循环,只要左边界 left 不大于右边界 right,就执行以下操作:

    a. 计算中间位置 middle,这是为了进行二分查找,以避免整数溢出。

    b. 如果 nums[middle] 等于目标元素 target,则表示找到了目标元素,然后开始搜索其范围。

    c. 初始化 startendmiddle,然后向左和向右搜索边界:

    • 向左搜索边界 start,通过不断将 start 减小直到不再与目标元素相等。
    • 向右搜索边界 end,通过不断将 end 增加直到不再与目标元素相等。

    d. 返回搜索到的左右边界,它们代表了目标元素在数组中的范围。

  3. 如果在循环中找到目标元素,则会在适当的时候返回搜索到的范围。

  4. 如果未找到目标元素,循环结束后,返回 {-1, -1},表示未找到目标元素。

知识点 

        进行二分查找以找到目标元素,然后在找到目标元素后,继续向左和向右搜索以确定它的范围。对于二分查找的内容可以看看下面的链接:

82.二分查找-CSDN博客

写在最后:以上就是本篇文章的内容了,感谢你的阅读。如果感到有所收获的话可以给博主点一个赞哦。如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

你可能感兴趣的:(刷题,leetcode,算法,职场和发展)