剑指offer之在排序数组中查找数字 I(C++/Java双重实现)
程序员文章站
2022-10-03 18:09:27
1.题目描述剑指 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 <= 数组长度 <= 500002.问题分析其实就是一个向左边界的二分查找,然后在往后遍历累加target在数组中个数的过程3.代码实现3.1C++代码cla...
1.题目描述
剑指 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
2.问题分析
其实就是一个向左边界的二分查找,然后在往后遍历累加target在数组中个数的过程
3.代码实现
3.1C++代码
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty())
return 0;
int left=0;
int right=nums.size()-1;
int mid;
while(left<=right)
{
mid=left+(right-left)/2;
if(nums[mid]<target)
left=mid+1;
else
right=mid-1;
}
if(left>=nums.size()||nums[left]!=target)
return 0;
else
{
int cnt=1;
while(1)
{
left++;
if(left<nums.size()&&target==nums[left])
cnt++;
else
break;
}
return cnt;
}
}
};
3.2Java代码
class Solution {
public int search(int[] nums, int target) {
if(nums.length==0)
return 0;
int left=0;
int right=nums.length-1;
int mid;
while(left<=right)
{
mid=left+(right-left)/2;
if(nums[mid]<target)
left=mid+1;
else
right=mid-1;
}
if(left>=nums.length||nums[left]!=target)
return 0;
else
{
int cnt=1;
while(true)
{
left++;
if(left<nums.length&&target==nums[left])
cnt++;
else
break;
}
return cnt;
}
}
};
本文地址:https://blog.csdn.net/qq_45737068/article/details/107486421