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,则数组中没有目标值,就不需要继续查找了。

浙公网安备 33010602011771号