이전 65 바이트 솔루션 :
r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}
새로운 솔루션. 19 바이트 포함import java.math.*;
@Nevay 덕분에 -8 바이트
r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}
온라인으로 사용해보십시오!
편집하다
내 원래 프로그램의 알고리즘은 훌륭했지만 사용 된 데이터 유형의 정적 크기는 크기가 특정 임계 값을 초과하면 상당히 빨리 파산되었음을 의미했습니다.
계산에 사용되는 데이터 유형을 변경하여이를 수용하기 위해 프로그램의 메모리 제한을 늘리십시오 ( 또는 BigInteger
대신 임의의 정밀도로 사용 ). 그러나 이것은 공간 복잡성으로 간주되는지 여부를 논란의 여지가 있습니다.int
long
O(1)
아래에 설명을 그대로 두겠습니다. 그러나 이제는 O(1)
약간의 가정없이 공간 복잡성 을 달성하는 것이 불가능하다고 생각합니다 .
증명
N
와 같은 정수로 정의하십시오 2 <= N
.
하자 S
임의 일련의 정수 나타내는 목록이 [x{1}, ..., x{N}]
, x{i}
제약이있다을 1 <= x{i} <= N
.
요소 당 정확히 한 번만이 목록을 반복하는 데 필요한 시간 복잡도 (Big-O 표기법)는 다음과 같습니다. O(n)
주어진 과제는 목록에서 첫 번째로 중복 된 값을 찾는 것입니다. 더 구체적으로, 우리는 S
목록의 이전 항목과 중복 되는 첫 번째 값을 검색 합니다.
하자 p
및 q
두 등 그 목록에있는 요소의 위치가 될 p < q
및 x{p} == x{q}
. 우리의 도전은 q
그러한 조건을 만족시키는 가장 작은 것을 찾는 것 입니다.
이 문제에 대한 명백한 접근 방식은 S를 반복 x{i}
하고 다른 목록에 존재 하는지 확인하는 것입니다. 존재 하지 않는 T
경우 이를 저장합니다 . 에 존재하는 경우 첫 번째 중복 값이므로 가장 작은 값이므로 반환합니다. 이 공간 효율성은 입니다.x{i}
T
T
x{i}
T
q
O(n)
시간 O(1)
복잡성을 유지하면서 공간 복잡성 을 달성하려면 O(n)
한정된 공간에 목록의 각 개체에 대한 고유 정보를 저장해야합니다. 이 때문에 알고리즘이 수행 할 수있는 유일한 방법은O(1)
공간 복잡도는 다음과 같다 : 1. N은 특정 유한 데이터 유형에 대해 가능한 최대 값을 저장하는 데 필요한 메모리에 해당하는 상한을 갖는다. 2. 단일 불변 변수의 재 할당은 복잡성, 변수의 수 (여러 변수 인 목록)에 대해서만 계산됩니다. 3. (다른 답변을 기반으로) 목록은 (또는 적어도 목록의 요소는 변경 가능), 목록의 데이터 유형은 부호있는 정수로 사전 설정되어 목록의 요소를 더 변경할 수 있습니다. 추가 메모리를 사용하지 않고.
1과 3은 데이터 유형에 대한 가정과 스펙이 필요하지만 2는 변수의 크기가 아니라 공간 복잡도 계산에 변수의 수만 고려하도록 요구합니다. 이러한 가정 중 어느 것도 받아 들여지지 않으면 O(n)
시간 복잡성과 O(1)
공간 복잡성을 모두 달성하는 것이 불가능할 것 입니다.
설명
우와,이 사람은 약간의 두뇌 능력 을 생각하는 데 창피한 시간 이 걸렸다 .
따라서 보너스를 받기가 어렵습니다. 전체 목록을 정확히 한 번만 조작 하고 추가 공간 복잡성없이 이미 반복 한 값을 추적 해야합니다 .
비트 조작은 이러한 문제를 해결합니다. O(1)
정수 쌍인 '스토리지'를 초기화 한 다음 목록을 반복하면서 첫 번째 정수의 i 번째 비트를 OR-하고 두 번째 결과를 저장합니다.
예를 들어,가 1101
있고로 OR 연산을 수행하면 10
을 얻습니다 1111
. 로 다른 OR을 수행해도 10
여전히 있습니다 1101
.
Ergo, OR 연산을 수행하고 같은 숫자로 끝나면 중복 된 것을 발견했습니다. 배열에 중복이 없으면 프로그램이 실행되어 예외가 발생합니다.