---間隔バイナリサーチを探します

間隔を探します

34.ソートされた配列に要素の最初と最後の位置を探します

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]

件名の説明:

  回数にソート配列に表示される数をカウントします。

アイデアの分析:

  この質問はタイトルで知られている問題を見つけるために、配列をソートするために属しているし、我々は最初の二分探索であると思いました。ソート配列で表示される番号を見つけるために回数を、私達はちょうど私たちは、それが配列に出現する回数を計算することができ、この番号の最初の発生の最後に出現することを確認場所や位置を作ります。比較のための第一の中間デジタルおよびKの配列を取るためにバイナリ検索アルゴリズム数がKの真ん中よりも大きい場合、我々は単に最初の半周期の次のラウンドを見つける必要があります。K未満ならば、我々は後半に見えます。Kはそれと等しい場合、我々はその前に、我々は数がKであるかどうかを確認する必要があり、これが最初のK Kではないかを決定する必要があり、そうでない場合は、以前の数は、最初のK、であるならば、中央の数字は、最初のKですKは確かに私たちは、前項、配列の次の段階の前半に見えます。同じことが、我々はちょうど最初の半周期の次のラウンドを見つける必要があり、数がKの真ん中よりも大きい場合、比較のためにデジタルとKの最後のK最初の中間配列を見つけるために取ります。K未満ならば、我々は後半に見えます。我々はKを決定する必要が等しいKは最後のKでない場合は、我々は数は確かに、その後、最後のK Kであれば数は、中間及び最終Kの数は、その後、Kでない場合ではないの世話をする必要があります半分の後、配列の次の段階は、我々は後半に見えます。

コード:

public int[]searchRange(int []nums,int target){
    if(nums==null||nums.length==0)
        return null;
    int first=0;
    int last=0;
    first=getFirst(nums,0,nums.length-1,target);
    last=getLast(nums,0,nums.length-1,target);
    if(first>-1&&last>-1){
        return new int[]{first,end};
    }
    return null;
}
public int getFirst(int []nums,int l,int h,int target){
    if(l>h)
        return -1;
    int mid=l+(h-l)/2;
    if(nums[mid]==target){
        if(mid>0&&nums[mid-1]!=target||mid==0){
            return mid
        }else{
            h=mid-1;
        }
    }else if(nums[mid]>target){
        h=mid-1;
    }else{
        l=mid+1;
    }   
     return getFirst(nums,l,h,target);
}
public int getLast(int []nums,int l,int h,int target){
    if(l>h)
        return -1;
    int mid=l+(h-l)/2;
    if(nums[mid]==target){
        if(mid<nums.length-1&&nums[mid+1]!=target||mid==nums.length-1){
            return mid;
        }else{
            l=mid+1;
        }
    }else if(nums[mid]>target){
        h=mid-1;
    }else{
        l=mid+1;
    }
    return getLast(nums,l,h,target);
}

おすすめ

転載: www.cnblogs.com/yjxyy/p/11106736.html