最终找到了我的代码和答案的区别,答案是进行两个二分查找,找第一个和最后一个,然后做差,我是用一个二分查找。为全局的两个变量赋值,从逻辑上,一个二分查找一个变量,是最合理的,容易实现的,这也是我的代码繁琐的原因。
我的繁琐的代码,还不对
int start_t = 0;
int end_t = 0;
public int search(int[] nums, int target) {
binarySearch(nums,0,nums.length - 1,target);
return end_t - start_t + 1;
}
public void binarySearch(int[] nums, int start,int end,int target){
int mid = (end + start)/2;
if(mid - 1 >= 0){
if(nums[mid] == target && nums[mid - 1] < target){
if()
start_t = mid;
return ;
}else if(nums[mid - 1] >= target && start <= mid - 1){
binarySearch(nums,start,mid - 1,target);
}
}
if(mid + 1 <= nums.length){
if(nums[mid] == target && nums[mid + 1] > target){
end_t = mid;
return ;
}else if(nums[mid + 1] <= target && mid + 1 <=end){
binarySearch(nums,mid + 1,end,target);
}
}
}
答案代码
class Solution {
int start_t = 0;
int end_t = 0;
public int search(int[] nums, int target) {
int number = 0;
if(nums != null&& nums.length>0){
int first = getFirstK(nums,nums.length, 0,nums.length-1,target);
int last = getLastK(nums,nums.length, 0,nums.length-1,target);
if(first > -1 && last > -1){
number = last - first +1;
}
}
return number;
}
public int getFirstK(int[] data,int length, int start,int end,int k){
if(start > end)
return -1;
int mid = (end + start)/2;
int middleDate = data[mid];
if(middleDate == k){
if((mid > 0&& data[mid - 1]!=k) || mid == 0)
return mid;
else
end = mid - 1;
}else if(middleDate > k)
end = mid - 1;
else
start = mid + 1;
return getFirstK(data,length, start,end,k);
}
public int getLastK(int[] data,int length, int start,int end,int k){
if(start > end)
return -1;
int mid = (end + start)/2;
int middleDate = data[mid];
if(middleDate == k){
if((mid < length - 1&& data[mid + 1]!=k )|| mid == length - 1)
return mid;
else
start = mid + 1;
}else if(middleDate < k)
start = mid + 1;
else
end = mid - 1;
return getLastK(data,length, start,end,k);
}
}