题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
第一思路
- logN的复杂度应该就是二分查找
- 查找两次,一次查到mid==target往左偏,一次往右偏复杂度是2logN
AC代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int len = nums.size();
vector<int> ans;
if (len <= 0) {
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
if (len == 1) {
}
int l = 0, r = len - 1;
int lt = -1, rt = -1;
while (l <= r) {
int mid = (l + r)/2;
if (nums[mid] == target){
lt = mid;
r = mid - 1;
continue;
}
if (nums[mid] < target) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
l = 0;
r = len - 1;
while (l <= r) {
int mid = (l + r)/2;
if (nums[mid] == target){
rt = mid;
l = mid + 1;
continue;
}
if (nums[mid] < target) {
l = mid + 1;
}
else {
r = mid - 1;
}
}
ans.push_back(lt);
ans.push_back(rt);
return ans;
}
};
改进
是否可以在查找到target中左右直接像左右拓展查找?
这样可能复杂度会接近N
网友评论