(LeetCode Medium) 배열의 단일 요소 정렬(Java)

질문

증가하는 숫자 배열을 제공하십시오.

모든 값은 쌍으로 존재하며 하나의 값만 존재합니다.

문제는 하나만 있는 값을 찾는 것입니다.

해결책

Map 만 사용하는 것은 문제가 있지만 추가 조건으로 O(log n) time and O(1) space 요구의 복잡성

이 조건을 만족하기 위해서는 이진 탐색이 필요하다.

그러나 이 질문은 일반적인 이진 검색과 달리 조회할 값을 별도로 주지 않는다.

따라서 범위를 반으로 나눌 때 찾고 있는 값이 왼쪽에 있는지 오른쪽에 있는지 알 수 있습니까?

힌트는 “각 숫자는 2개여야 합니다”입니다.

확실히 연속으로 두 개가 있기 때문에 인덱스 위치를 찾아 숫자를 비교하면 값이 하나만 있는 곳을 찾을 수 있습니다.

대신 현재 인덱스가 홀수인지 짝수인지에 따라 비교 대상이 달라지므로 그 부분만 확인하면 된다.

영상

자바 코드

class Solution {
    public int singleNonDuplicate(int() nums) {
        int left = 0;
        int right = nums.length - 1;
        int mid = 0;

        while (left < right) {
            mid = (left + right) / 2;

            if (mid % 2 == 0 && nums(mid) == nums(mid + 1)) {
                // mid 위치가 짝수면 오른쪽 값이랑 비교하고 같으면 single 은 오른쪽에 있음
                left = mid + 2;
            } else if (mid % 2 == 1 && nums(mid) == nums(mid - 1)) {
                // mid 위치가 홀수면 왼쪽 값이랑 확인하고 같으면 single 은 오른쪽에 있음
                left = mid + 1;
            } else {
                // 위에 전부 해당 안되면 single 은 왼쪽에 있음
                right = mid;
            }

        }

        return nums(left);
    }
}