728x90

투 포인터

투 포인터는 2개의 포인터로 알고리즘의 시간 복잡도를 최적화한다.

  • 리스트에 순차적으로 접근해야 할 때 두 개의 점의 위치를 기록하면서 처리하는 알고리즘
  • 정렬되어있는 두 리스트의 합집합에도 사용된다.

시간 복잡도

투 포인터는 O(n)의 시간 복잡도를 가집니다.

 

1. sum에 누적을 시키면서 전체를 탐색하는 투 포인터 이동 원칙

투 포인터 이동 원칙을 활용해 배열의 끝까지 탐색하면서 합이 N이 될 경우의 수를 구한다.

start_index를 오른쪽으로 한 칸 이동하는 것은 연속된 자연수에서 왼쪽 값을 삭제하는 것과 효과가 같으며, end_index를 오른쪽으로 한 칸 이동하는 것은 연속된 자연수의 범위를 한 칸 더 확장한다는 의미이다. 같을 때는 1 증가시키고 end_index를 오른쪽으로 이동한다.

 

while(end_index != N) 일 때까지 반복

  • sum > N : sum = sum - start_index; start_index++;
  • sum < N : end_index++; sum = sum sum + end_index;
  • sum == N : end_index++; sum = sum + end_index; count++;

2. 2개를 가지고 전체를 탐색하는 투 포인터 이동 원칙

오름차순으로 정렬해야된다. 

while( i < j )

  • A[i] + A[j] > M : j--;   -> 번호의 합이 M보다 크므로 큰 번호 index를 내린다.
  • A[i] + A[j] < M : i++;  -> 번호의 합이 M보다 작으므로 작은 번호 index를 올린다.
  • A[i] + A[j] == M : i++; j--; count++;  -> 양쪽 포인터를 모두 이동시키고 count를 증가시킨다.
728x90

'알고리즘 > 알고리즘 이론' 카테고리의 다른 글

그리디  (0) 2022.06.20
이진 탐색  (0) 2022.06.20
BFS  (0) 2022.06.20
DFS  (0) 2022.06.20
스택과 큐  (0) 2022.06.18

+ Recent posts