"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 두 포인터 알고리즘 설명

두 포인터 알고리즘 설명

2024-11-08에 게시됨
검색:511

Two pointers algorithm explained

배열, 문자열, 연결 목록 등을 다룰 때 인터뷰에서 사용할 수 있는 간단하고 효과적인 기술을 설명하고 싶습니다. 이는 또한 이러한 데이터에 대한 기본 지식을 향상시킬 것입니다. 구조.

이론부터 시작해 보겠습니다. 이 알고리즘에는 두 가지 일반적인 사용 사례가 있습니다.

  • 왼쪽/오른쪽 이 알고리즘의 중심 개념은 문자열이나 배열의 양쪽에서 이동하는 두 개의 정수 변수를 갖는 것입니다. 보통 사람들은 이를 왼쪽(left)과 오른쪽(right)이라고 부릅니다. 왼쪽은 인덱스 0에서 길이 - 1로 이동하고 오른쪽은 반대입니다.

  • 느린/빠른 포인터는 같은 방향(예: 처음부터 끝까지)으로 실행되지만 한 포인터는 다른 포인터보다 빠르게 실행됩니다. 이 경우 사람들은 일반적으로 변수를 느리고 빠르게 호출합니다.

알고리즘은 기본적이며 이를 이해하는 가장 좋은 방법은 몇 가지 예를 살펴보는 것입니다.

먼저 왼쪽 포인터와 오른쪽 포인터가 있는 경우를 살펴보겠습니다. 다음은 이 알고리즘을 사용하여 해결할 수 있는 문제의 기본 예입니다. 목표는 분명합니다. 합이 주어진 숫자와 같은 쌍을 찾는 것입니다.
무차별 접근 방식은 중첩 루프를 생성하지만 이를 사용하여 인터뷰를 통과할 가능성은 낮습니다.
더 나은 접근 방식은 두 포인터 알고리즘을 사용하고 하나의 루프에서 O(n²)

대신 O(n) 복잡성을 갖는 것을 찾는 것입니다.

const findPair = (arr, target) => {
    let left = 0;                 // Start with two pointers left from start, right, from the end
    let right = arr.length - 1;

    while (left 

포인터의 속도가 다른 접근 방식으로 전환해 보겠습니다. 면접으로 만날 수 있는 빈번한 문제입니다. 주어진 Linked List의 중간 부분을 찾아야 합니다.
무차별 접근 방식은 이전 예만큼 나쁘지는 않지만 면접관은 더 나은 접근 방식을 기대합니다.
두 포인터 알고리즘을 사용하면 O(n) 복잡성으로 이 문제를 해결할 수 있는 반면, 두 개의 순차 루프를 사용하면 무차별 접근 방식은 O(2n)이 필요합니다.


class ListNode {
    constructor(value) {
        this.value = value;
        this.next = null;
    }
}

const findMiddle = (head) => {
    if (!head) return null;

    let slow = head;
    let fast = head;

    while (fast && fast.next) {
        slow = slow.next;           // Move slow pointer one step
        fast = fast.next.next;      // Move fast pointer two steps
    }

    return slow;  // Slow pointer will be at the middle
}

// Creating a linked list 1 -> 2 -> 3 -> 4 -> 5
const head = new ListNode(1);
const node2 = new ListNode(2);
const node3 = new ListNode(3);
const node4 = new ListNode(4);
const node5 = new ListNode(5);

head.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;

findMiddle(head).value);  // Output: 3 (middle node)


릴리스 선언문 이 글은 https://dev.to/okaz/two-pointers-algorithm-explained-3k0e?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3