题目如下:
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提供两种解法:
第一就是遍历了,在一个for循环中如果元素值等于目标计数器+1,就出来了
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int count = 0;
int length = nums.size();
for(int i=0; i<length; i++)
{
if (target == nums[i]) count++;
}
return count;
}
};
第二种方法就比较复杂了用二分法查找目标值最左边和最右边的下标,再做差就好,代码比较复杂,需要考虑很多情况,就是if嵌套if,结果好像没有比第一种方法优秀,这里要设一个flag,如果找到目标就把flag置1,用于判断数组里是否有目标,避免死循环。代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int start = 0;
int length = nums.size();
int end = nums.size();
int mid = (start + end)/2;
int flag = 0;
//搜索最左边k的下标
int left_location = 0;
for(int i = length ; i>0; i /= 2)
{
mid = (start + end)/2;
if(nums[mid] == target)
{
flag = 1;
if (mid == 0)
{
left_location = 0;
}
else if (nums[mid-1] != target)
{
left_location = mid;
break;
}
else end = mid;
}
if(nums[mid] < target)
{
start = mid;
}
if (nums[mid] > target)
{
end = mid;
}
}
start = 0;
end = nums.size();
mid = (start + end)/2;
//搜索最后边k的下标
int right_location = 0;
for(int i = length ; i>0; i /= 2)
{
mid = (start + end)/2;
if(nums[mid] == target)
{
if (mid == length-1)
{
right_location = length-1;
}
else if (nums[mid+1] != target)
{
right_location = mid;
break;
}
else start = mid;
}
if(nums[mid] < target)
{
start = mid;
}
if (nums[mid] > target)
{
end = mid;
}
}
if (flag == 0) return 0;
else return right_location-left_location+1;
}
};