私は2つの間隔の配列trip_beginningとtrip_endを持っています。 trip_beginning [j] trip_end [j] j番目の区間の終了と開始を表します。 配列MとSがソートされます。O(log(n))の時間間隔でカウントする
Sに索引が含まれていればトリップ(badTrip)を除外する必要があり、badTripでない場合は、その区間のM個の索引の数をカウントアップする必要があります。 最後にmaxCtカウント(tripMax)でのトリップが勝ちます。
コードは正しい結果を返しますが、漸近的に速くなる必要があります。これがそうでないforループ のT *(ログ(M + S)。 ための。 は間の間隔(税込。エンドポイント)の比較を行うための迅速な方法がありますか?
int tripMax = 0;
int maxCt = Integer.MIN_VALUE;
for (int j=0; j< trip_beginning.length; j++){
int tripNo = j+1;
boolean badTrip = false;
int tripS = trip_beginning[j];
int tripE = trip_end[j];
int mountains = 0;
for (int k=tripS; k <= tripE; k++){
if (Bsearch(S,k)==1){
badTrip= true;
// break;
}
if (!badTrip && Bsearch(M,k)==1){
mountains++;
}
} //endfor
if (!badTrip && (mountains>maxCt)){
maxCt = mountains;
tripMax = tripNo;
}
ありがとう - "バイナリ検索では、対応する値が検索する数値よりも小さい最大のインデックスを見つけるはずです。" これが見つからない場合、すべての値よりも小さい値は-1を返します。見つからない場合、配列の最後にすべての値より大きい値がインデックスを返しますか? – Mathflunkie
@Mathflunkieはい、正確です。 – Dabiuteef