タイトル
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]
概念
規則的な配列でチャールズとログ(N)の対象SAW素子は、はい、ルックアップどのような基本的なバイナリで我々一見、バイナリ検索を考えることができます。
バイナリ検索は、一般的に線形リストで注文(の要素が直接アクセスすることができなければならない)の要素を見つけるために使用され、時間の複雑さは、ログ(n)は、どのようにカウントするために、私は本当に知りません。2つのバイナリサーチポインタを使用すると、検索対象の要素のインデックスと終了インデックスを開始示しています。以下のような:
そしてこの質問は要素だけでなくを見つけるために私たちを必要とするも、二分探索の改善ので、我々は、要素を見つけることができません直接破るが、右=半ば1(この使用をするために、この要素の開始と終了を見つけるように求め(この要素が最も後方を見つけるために使用される)最前方の要素を見つける。)または1 =ミッド+左へ。
基本的なバイナリ検索テンプレート
//target是目标元素,left right分别是左右指针
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}
}
コードを送信
public class problem34 {
public int[] searchRange(int[] nums, int target) {
int[] targets={-1,-1};
targets[0]=binarySearch(nums, target, true);
targets[1]=binarySearch(nums, target, false);
return targets;
}
public int binarySearch(int[] nums,int target,boolean findleft){
int left=0;
int right=nums.length-1;
int index=-1;
//二分查找
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]==target){
index=mid;
//以下的if-else属于对二分查找的更改
if(findleft) right=mid-1;
else left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else if(nums[mid]<target){
left=mid+1;
}
}
return index;
}
public static void main(String[] args) {
problem34 pro=new problem34();
int[] nums={5,7,7,8,8,10};
int[] re=pro.searchRange(nums, 6);
System.out.println(re[0]+" "+re[1]);
}
}