算法打卡-二分查找-lt34-在排序数组中查找元素的第一个和最后一个位置

182 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。

一、 题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/fi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、 思路分析

题目关键信息点:已排序,查找

基本思路

  1. 声明一个vector<int> index{2,-1}
  2. 遍历整个数组,如果遇到target时候判断index[0] == -1,如果等于-1那么这就是第一个下标 。
  3. 继续遍历,一旦遇到 nums[i] == target 就把 index[1]更新为相应的index
  4. 遇到不是target的数就可以break出循环了,(排序数组).

这种方法需要逐个遍历元素 , 如果结果比较靠后就需要遍历整个数组,结果不理想。可以优化下,用二分查找。

二分查找思路

可以定义一个函数找 up_index, 一个函数找down_index

  • up_index 在二分查找时候要找的是最后一个 目标 target 所以 在判断 指针移动时候 应该注意 if (nums[mid] <= target){ left = mid } 保证所便利元素等于 target情况下 依然要 向右边 移动left指针,来保证取到的一定是最大值

  • down_index 在二分查找的时候要找第一个目标,目标 target 所以 在判断 指针移动时候 应该注意 if (nums[mid] >= target){ right = mid } 保证所便利元素等于 target情况下 依然要 向左边 移动right指针,来保证取到的一定是下标最小值.

三、 AC代码

image.png

四、归纳总结

最重要的就是 在二分查找时候,左指针和右指针的移动。 弄明白 当遍历到的数字与target 相等时候 因该怎么移动指针,就ok了👌。