题目1描述:
在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
初始解法
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
bool sign = false;
vector<int> result{};
for (auto& item : nums) {
if (item == target) {
sign = true;
break;
}
}
if (!sign) {
result.emplace_back(-1);
result.emplace_back(-1);
std::cout << "[-1, -1]" << std::endl;
return result;
}
for (int i=0; i<nums.size(); i++) {
if (nums[i] == target) {
result.emplace_back(i);
break;
}
}
for (int i=nums.size()-1; i>=0; i--) {
if (nums[i] == target) {
result.emplace_back(i);
break;
}
}
std::cout << "[" << result[0] << ", " << result[1] << "]" << std::endl;
return result;
}
};
方法一: 暴力破解法
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int size = (int)nums.size();
vector<int> result{};
if (size == 0)
return vector<int>{-1, -1};
for (int i=0; i<size; i++) {
if (nums[i] == target)
result.emplace_back(i);
}
if (result.empty())
return vector<int>{-1, -1};
else {
return vector<int>{result[0], result[result.size()-1]};
}
}
};
方法二: 二分查找法(数组是升序的)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int leftIndex = binarySearch(nums, target, true);
int rightIndex = binarySearch(nums, target, false) - 1;
if (leftIndex <= rightIndex && rightIndex < nums.size())
return vector<int>{leftIndex, rightIndex};
return vector<int>{-1, -1};
}
int binarySearch(vector<int>& nums, int target, bool lower) {
int left = 0;
int right = (int)nums.size()-1;
int ans = (int)nums.size();
int mid = 0;
while (left <= right) {
mid = (left + right) / 2;
if (nums[mid] > target || (lower && nums[mid] >= target)) {
right = mid - 1;
ans = mid;
}
else {
left = mid + 1;
}
}
return ans;
}
};