NUMSターゲットとつの目標値に応じて、昇順に配列された整数の配列を考えます。アレイ内の所与の標的の開始および終了位置を特定します。
アルゴリズムのあなたの時間の複雑さはO(n個のログ)レベルでなければなりません。
標的がアレイ内に存在しない場合は、[-1、-1]返します。
例1:
入力:NUMS = [5,7,7,8,8,10]、目標 = 8
出力:[3,4]
実施例2:
入力:NUMS = [5,7,7,8,8,10]、目標 = 6
出力:[-1、-1]
アイデア:最初の二分法は、要素を見つけ、その後、右へ左へと拡散
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = {-1, -1};
int length=nums.length;
if (length== 0) return res;
int left=0;
int right=length-1;
int mid=0;
while(left<=right){
mid=(left+right)/2;
if (nums[mid] == target) {
left = mid;
right = mid;
while (left > 0 && nums[left] == nums[left-1]) left--;
while (right < length - 1 && nums[right] == nums[right+1]) right++;
res[0] = left;
res[1] = right;
return res;
}
else if(nums[mid]>target){
right=mid-1;
}
else{
left=mid+1;
}
}
return res;
}
}