题目描述
思路:找到target-1的最右边的数和target最右边的数,两个减以下就好
代码如下:
class Solution {
public int search(int[] nums, int target) {
//找到最右边的数,两数相减
//target-1 最右边的数,target最右边的数
return binarysearch(nums,target)-binarysearch(nums,target-1);
}
public int binarysearch(int[] nums,int target)
{
int left=0;
int right=nums.length;
while(left<right)
{
int mid=left+(right-left)/2;//right=n保证了二分和left<right
if(nums[mid]>target)
{
right=mid;
}
else//<=都给左边
{
left=mid+1;
}
}
return left;
}
}
可能存在的疑惑
1.怎么保证找到最右边的数?
while(left < right)
------------------------
else//<=都给左边
{
left=mid+1;
}
这两段实现了找到最右边的数
举例:当结果为[4,5] , 目标为4时,
left = 4
right = 5
mid = 4
按照判断,left = mid +1;
此时,left == right跳出了循环
left-1 或者 right-1 就是target 的最右边的数
实现了了找到最右边的数
2.right = nums.length 而不是 nums.length-1
1.因为nums[right] 并没有被访问到
2.保证了mid 每次都是一半
int mid=left+(right-left)/2
3.mid = left +(right-left) /2 而不是 mid = (left+right)/2
当left和right 比较小的时候,两种情况都行
但有一种情况是left 和 right 都比较大 ,此时,left + right就会导致移除,所以用减法更好