题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty()) {
return {-1, -1};
}
vector<int> ResultPos;
int left = 0, right = nums.size() - 1;
int first = -1, second = -1;
while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] == target)
{
first = mid;
right = mid - 1;
}
else if(nums[mid] > target)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
left = 0, right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] == target)
{
second = mid;
left = mid + 1;
}
else if(nums[mid] > target)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
ResultPos.push_back(first);
ResultPos.push_back(second);
return ResultPos;
}
};
这个代码让我对于二分法有了重新的认识,也就是假如说,以往找的都是数组中全都不同数的某一个数,而这个题目是数组中有相同的找第一个位置的。
我就拿查找某一个元素的第一个位置为例
int left = 0, right = nums.size() - 1;
int first = -1, second = -1;
while(left <= right)
{
int mid = left + (right - left) / 2;
if(nums[mid] == target)
{
first = mid;
right = mid - 1;
}
else if(nums[mid] > target)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
这个代码我原本以为是只能找到中间就截止了,但其实我想过,while里面的条件就是left <= right
所以就算你找到了相同的元素,但是只要left <= right,那就不会停止搜索,所以让right往左移,找到第一个。这里讲一下为什么是right = mid - 1而不是left = mid + 1, 其实你想想,要是想找到前面的,是不是得需要一个指针往前走,那么这个也就是right = mid - 1;同理,想找到某一个元素的最后一个位置的话,那就得用left = mid + 1去找。