【白俊アルゴリズム】10815号:デジタルカード


質問する
デジタルカードは整数と書かれたカードです.尚根にはN枚のデジタルカードがあります.整数M個を指定した場合は、前のルートにその数が書かれたデジタルカードがあるかどうかを判断するプログラムを作成します.
入力
1行目には、上位のデジタルカードの個数N(1≦N≦500000)が与えられる.2行目には、数値カードの整数が表示されます.デジタルカードに書かれている数字は-1000000以上、1000000未満です.2枚の数字カードに同じ数字はありません.
3行目はM(1≦M≦500000)を与える.4行目には、上のルートに数値カードがあるかどうかを求めるためにスペースで区切られたM個の整数が与えられます.この数-1000000以上、1000000未満です.
しゅつりょく
最初の行に入力されたM個の数値について、上のルートに各数値が書かれた数値カードがある場合は、1、または0をスペースで区切って出力します.
コード#コード#
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class BOJ_10815 {
    static int N;
    static int[] cards;
    static int M;
    static int[] haveCards;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());

        cards = new int[N];
        String[] input1 = br.readLine().split(" ");
        for (int i = 0; i < N; i++) {
            cards[i] = Integer.parseInt(input1[i]);
        }
        Arrays.sort(cards);

        M = Integer.parseInt(br.readLine());
        haveCards = new int[M];
        String[] input2 = br.readLine().split(" ");
        for (int i = 0; i < M; i++) {
            haveCards[i] = Integer.parseInt(input2[i]);

            if (binarySearch(haveCards[i])) System.out.print("1 ");
            else System.out.print("0 ");
        }
    }

    public static boolean binarySearch(int num) {
        int minIndex = 0;
        int maxIndex = N - 1;

        while (minIndex <= maxIndex) {
            int middleIndex = (minIndex + maxIndex) / 2;
            int middleNum = cards[middleIndex];

            if (num < middleNum) maxIndex = middleIndex - 1;
            else if (num > middleNum) minIndex = middleIndex + 1;
            else return true;
        }
        return false;
    }
}
答えと感じ
二分探索を用いた.
最小値が最大値以下の場合、文をループします.
中間インデックスを求めた後に、中間インデックスの値を求めます
必要な数値が中間インデックスより小さい場合は、最大値に「中間値-1」を格納し、検索範囲を縮小します.
必要な数値が中間インデックスより大きい場合は、最小値に「中間値+1」を格納し、検索範囲を縮小します.
要求された数字が中間インデックスと同じ場合、正しい答えが求められたためtrueが返されます.
参考資料