目标:在非递减数组中统计一个数字出现的次数。
1.遍历(O(n)时间复杂度,很容易想到的解法,不过应该不是面试考察的内容
class Solution {
public:
int search(vector<int>& nums, int target) {
//O(n)时间复杂度,直接遍历
int count=0;
for(auto x:nums){
if(x==target){
count++;
}
}
return count;
//或者直接一行代码:return count(nums.begin(),nums.end(),target);
}
};
2.二分法(O(log)时间复杂度,通过简单题目复习一下二分法
参考了那个男人的题解:
面试题53 - I. 在排序数组中查找数字 I(二分法,清晰图解)
class Solution {
public:
int search(vector<int>& nums, int target) {
return binsearch(nums,target)-binsearch(nums,target-1);
}
int binsearch(vector<int> nums,int target){ //二分查找传入数组和查找的值
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]<=target){ //等于是细节,会查找到右边界
left=mid+1;
}
else{
right=mid-1;
}
}
//cout<<left<<" "<<right<<" "<<endl;
return left;
}
};