Finally found the difference between my code and the answer. The answer is to perform two binary searches, find the first and last one, and then do the difference. I used one binary search. Assigning values to two global variables is logically the most reasonable and easy to implement. This is why my code is cumbersome.
My cumbersome code is not right
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);
}
}
}
Answer code
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);
}
}