홈>
저는 아마존 소프트웨어 인터뷰 :
Given an integer N and an array of unsorted integers A find all pairs of numbers within A which add up to N
Java로 작동하는 솔루션이 있습니다 :
static void allPairsAddToN(int[] array, int n) {
for(int c=0;c<array.length; c ++) {
for(int j=c+1; j<array.length; j++) {
if(array[c] + array[j] == n)
System.out.println("(" + array[c] +", " + array[j] +")" );
}
}
}
이것이 가장 효율적인 솔루션입니까? 나에게 이것은 \ $O (n ^ 2) \ $에서 실행되는 무차별 대입 방식입니다. 그러나이 문제에 대해 모든 가능성을 고려하지 않아도됩니까 (정렬되지 않은)? 당신이하지 않는 몇 가지 트릭이 있습니까?
- 답변 # 1
- 답변 # 2
'찾기'의 의미에 따라 달라집니다. 쌍을 세고 싶고 여분의 메모리를 사용하지 않아도되는 경우 하나의 옵션이 있습니다.
정수에서 정수로 빈 해시 맵을 만듭니다. 이것은 우리가 본 각 숫자의 발생 횟수를 저장합니다.
배열의 각 요소 \ $x \ $에 대해지도를 사용하여 \ $N-x \ $의 횟수를 확인하십시오. 그런 다음지도에서 \ $x \ $의 발생 횟수를 늘리십시오.
쿼리와 삽입은 보통 \ $O (1) \ $이므로 \ $O (n) \ $시간에 실행됩니다. 여기서 \ $n \ $는 배열의 길이입니다.
계산하는 대신 쌍을 열거하려면 (예 : 인쇄) 최악의 경우는 모든 쌍의 합계가 \ $N \ $일 때입니다. 예를 들어, 배열은 \ $\ {x, x, x, \ ldots, x \} \ $및 \ $N = 2x \ $입니다.
배열의 길이가 $$n \ $이면 \ $\ binom n2 = \ frac {n (n-1)} {2} = O (n ^ 2) \ $쌍이 있으므로 모든 알고리즘 최악의 경우 적어도 \ $O (n ^ 2) \ $시간이 소요될 것이라고 열거합니다.
관련 자료
- regex - 단락 내에서 일치하는 문자열 찾기
- python - 세트에 숫자 쌍을 효율적으로 저장하는 방법은 무엇입니까?
- python - 객체 피처 내 숫자 사이에서 텍스트를 바꾸는 방법
- scala - 일련의 숫자가 허용 범위 내에 있는지 확인
- 특정 부분 문자열로 끝나지 않는 숫자를 찾기위한 Java 패턴 정규식
- python - 일부 범위 내에서 01 씩 증가하는 연속적인 숫자 목록 생성
- regex - 정규식 - 파일 내에서 일치 항목을 찾는 데 도움이 필요합니다
- java - 배열에서 연속 된 숫자의 가장 큰 합계 찾기
- java - 정렬되지 않은 배열에서 가장 큰 K 숫자 찾기
- python - 사용자 입력으로 숫자 목록을 만든 다음 제공된 목록의 평균, 중앙값 및 모드를 찾는 방법
- r - 그것이 거리의 13 숫자의 시퀀스 내에있는 경우 관찰 1
- swift - 배열 내에서 단어 찾기
- r - 데이터 프레임의 NA를 범위 내의 난수로 바꿉니다
- assembly - 50과 259 범위 내에서 한 번, 50과 159 범위 내에서 두 개의 난수를 생성하는 방법
- python - 요소가 유사한 숫자를 갖지 않도록 목록에서 요소 찾기
- XSLT를 사용하여 날짜가 날짜 범위 내에 있는지 확인
- python - 문제는 1에서 num까지 곱하여 num이되는 두 개의 숫자를 찾는 것입니다
- x86 어셈블리에서 매크로를 사용하여 최소 3 개 숫자 찾기
- prolog - 목록 내에서 술어 발생 찾기
- 배열 C Lang에서 숫자 쌍의 최소값 찾기
정렬 된n숫자 배열을 가진 경우N에 해당하는 쌍을 찾으려면 O (n) 시간이 걸립니다.
정렬에는 O (n로그n) 시간이 걸립니다.
O (n로그n+n)은 O (n로그n). O (n2)보다 낫습니다. 따라서 배열을 먼저 정렬하는 것이 좋습니다.