私はついに自分のコードと答えの違いを見つけました。答えは、2つのバイナリ検索を実行し、最初と最後の検索を見つけてから、違いを実行することです。1つのバイナリ検索を使用しました。2つのグローバル変数に値を割り当てることは、論理的に最も合理的で実装が簡単です。これが私のコードが面倒な理由です。
私の面倒なコードは正しくありません
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);
}
}