Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、 题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/fi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、 思路分析
题目关键信息点:已排序,查找
基本思路
- 声明一个
vector<int> index{2,-1} - 遍历整个数组,如果遇到target时候判断
index[0] == -1,如果等于-1那么这就是第一个下标 。 - 继续遍历,一旦遇到
nums[i] == target就把index[1]更新为相应的index。 - 遇到不是
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代码
四、归纳总结
最重要的就是 在二分查找时候,左指针和右指针的移动。 弄明白 当遍历到的数字与target 相等时候 因该怎么移动指针,就ok了👌。