啥也写不对真烦******************
思路
因为是有序数组,所以这个数字的出现是连续的。找到左右边界left和right,出现次数就是right-left-1
使用二分查找,
nums[mid]>target时,right–;nums[mid]<target时,left++;
nums[mid]==target时,找右边界left++;找左边界right–;
优化:
查找完右边界后,可用 nums[right] ==right 判断数组中是否包含target ,若不包含则直接提前返回0 ,无需后续查找左边界。
代码
class Solution {
public int search(int[] nums, int target) {
int len=nums.length;
if(len==0){
return 0;
}
//初始化
int left=0;
int right=len-1;
int mid;
//找右边界
//right<left时退出
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]==target){
left=mid+1;//右边界
}
else if(nums[mid]>target){
right=mid-1;
}
else{
left=mid+1;
}
}
//跳出时left指向右边界
//右边界b
int b=left;
//数组中无target 提前返回
if(right >= 0 && nums[right] != target) return 0;
//重新初始化
left=0;
//right=len-1;优化时删掉这句
//查找完右边界后,左边界一定在闭区间[0,right] 中,因此直接从此区间开始二分查找即可。
//找左边界
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]==target){
right=mid-1;//左边界
}
else if(nums[mid]>target){
right=mid-1;
}
else{
left=mid+1;
}
}
//跳出时right指向左边界
//左边界a
int a=right;
return b-a-1;
}
}
复杂度
时间复杂度O(logn) :二分法为对数级别复杂度
空间复杂度O(1)