배열 nums의 n은 정수를 포함 감안 세 요소의 C nums되도록 + B + C = 0, A, B가 존재하는지의 여부를 판정한다? 모든 조건이 중복 된 트리플을 찾을 만족하지 않습니다.
주 : 대답은 중복 트리플을 포함 할 수 없습니다.
예를 들어, 어레이의 nums = 주어진 [-1, 0, 1, 2, -1, -2,
트리플로 설정된 요건을 충족 :
[
[-1, 0, 1],
[-1, -1, 2
]출처 : 유지 버튼 (LeetCode)
링크 : https://leetcode-cn.com/problems/3sum
분석 :
폭력 O의 복잡성 (N ^ 3) 타임 아웃 확실히
먼저 이중 포인터 방법 (K1)에 의해 다시 보면 그 K1 <K2 =에게 <= K3, 고정 제, K1, K2 및 K3 가정 배열을 정렬
당신은 자연을 활용할 수 있습니다 :
1. (K1)는 0보다 크고, 0, 스킵 K1 동일하지 확실히 셋의 합이면
2. V [I] == 브이 [I-1, I-1 다음은 생략 할 수있는 경우, 이것은 필연적으로 재현 결과를 가져올 것이기 때문에
세트를 사용할 수있다 중복 결과를 제거
시간 복잡도 : O (N ^ 2)
정렬의 복잡도가 O (N * N 로그)이지만, 그 후의 정착이 두 포인터를 볼 + 복잡도가 O 인 중 큰 (N ^ 2), 시간 복잡도는 O (N ^ 2)
우주의 복잡성 : 빠른 방전 요구, 최상의 경우 : O (N 로그), 최악의 경우 : O (N)
암호:
클래스 해결 { 공개 : 벡터 <벡터 < INT >> threeSum (벡터 < INT > & a) { 벡터 <벡터 < INT >> 절; 벡터 < INT > V; 설정 <벡터 < INT >> S; 설정 <벡터 < INT >> ::를 반복자; INT N = a.size (); 경우 (N < 3 ) 복귀 VV; 종류 (a.begin (), a.end ()); K = 0 ; K <N- 2 k 번째 ++ ) { 경우 (a [K]가> 0 ) 계속 ; 경우 (K> 0 && A [K- 1 ] == A [K]) 계속 ; INT의 L = K + 1 ; INT의 H = N- (1) ; // COUT << "K ="<< K << "L ="<< L << "H ="H << << ENDL; s.clear (); 반면 (L < H) { INT ANS = A [K] + A [1] + A [H]; //COUT << "L ="<< L << "H ="H << << "ANS ="<< ANS << ENDL; 경우 (ANS == 0 ) { v.clear (); v.push_back (a [K]); v.push_back (a [1]); v.push_back (a [H]); s.insert (V); 리터 ++ ; 시간 - ; } 다른 경우 (ANS < 0 ) { L ++ ; } 다른 경우 (ANS>- ; } } 경우 (s.size ()! = 0 ) { 위해은 (는 s.begin을 () =,! = 그것이 s.end을 ();는 ++ ) { vv.push_back ( * IT); } } } 반환 절; } };