[Lc]面试题53_I在排序数组中查找数字I
Contents
题目
题解
1. 挨个查找法
- 时间复杂度$O(N)$
- 空间复杂度$O(1)$
就是挨个查找数组,找到的第一个就是开始位置,找到的最后一个就是结束位置。
这个比较好写,但是对于这道题会超时
2. 二分查找法
- 时间复杂度$O(logN)$
- 空间复杂度$O(1)$
利用二分查找的性质,可以缩短时间复杂度
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty()) return 0;
//起始位置
int start = find1stNum(nums, target);
//起始位置判断不合规直接返回0
if(start > nums.size() - 1 || nums[start] != target) return 0;
//结束位置,是找比target大1的数的位置-1,由于最后计算位置差的时候还要+1
//因此这里把结束位置标记为最后一个target的下一个位置
int end = find1stNum(nums, target + 1) ;
//计算位置差
return end - start;
}
//二分查找找起始位置
int find1stNum(vector<int>& nums, int target){
//注意right不用-1,因为寻找end的时候是找到其下一个的位置
int left = 0, right = nums.size();
//二分查找
while(left<right){
int mid = left + (right - left) / 2;
//注意这里用 < 才能找到第一个为target的位置
if(nums[mid] < target) left = mid + 1;
else right = mid;
}
return left;
}
};
Author ChrisHRZ
LastMod 2020-06-22