《剑指offer》面试题53 - I. 在排序数组中查找数字 I
问题描述
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size(),left = 0,right = n-1,ans= 0,middle;
if(n == 0)return 0;
//先找左边界,再向右寻找
while(left < right)
{
middle = left + (right - left)/2;
if(nums[middle] < target)
left = middle+1;
else
right = middle;
}
while(left < n && nums[left]==target)++left,++ans;
return ans;
}
};
结果
执行用时 :12 ms, 在所有 C++ 提交中击败了71.11%的用户
内存消耗 :13.1 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size(),left = 0,right = n-1,middle,tmp;
if(n == 0)return 0;
//先找左边界
while(left < right)
{
middle = left + (right - left)/2;
if(nums[middle] < target)
left = middle+1;
else
right = middle;
}
//再找右边界left可以不用动了
right = n-1;
if(nums[left] != target)return 0;//如果没有找到直接返回
tmp = left;
while(left < right)
{
middle = left + (right-left+1)/2;//注意找右中值
if(nums[middle] > target)
right = middle - 1;
else
left = middle;
}
return right - tmp + 1;
}
};
结果
执行用时 :16 ms, 在所有 C++ 提交中击败了47.55%的用户
内存消耗 :13.3 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int ans=0;
for(int i:nums)
{
if(i == target){
++ans;
}
else if(i > target)
break;
}
return ans;
}
};
结果
执行用时 :20 ms, 在所有 C++ 提交中击败了31.61%的用户
内存消耗 :13.3 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
return upper_bound(nums.begin(), nums.end(), target) - lower_bound(nums.begin(), nums.end(), target);
}
};
结果
执行用时 :16 ms, 在所有 C++ 提交中击败了47.55%的用户
内存消耗 :13.2 MB, 在所有 C++ 提交中击败了100.00%的用户