>  기사  >  웹 프론트엔드  >  두 포인터 알고리즘 설명

두 포인터 알고리즘 설명

Susan Sarandon
Susan Sarandon원래의
2024-10-07 20:20:30741검색

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 < right) { // when pointers meet, finish loop
        const sum = arr[left] + arr[right];

        if (sum === target) {
            return [arr[left], arr[right]];  // Return the pair if we find the target sum
        } else if (sum < target) {
            left++;  // Move left pointer to the right if sum is less than target
        } else {
            right--;  // Move right pointer to the left if sum is greater than target
        }
    }

    return null;  // Return null if no such pair exists
}

const arr = [1, 2, 3, 4, 6];
const target = 6;

findPair(arr, target);  // Output: [2, 4]


포인터의 속도가 다른 접근 방식으로 전환해 보겠습니다. 면접으로 만날 수 있는 빈번한 문제입니다. 주어진 Linked List의 중간 부분을 찾아야 합니다.
무차별 접근 방식은 이전 예만큼 나쁘지는 않지만 면접관은 더 나은 접근 방식을 기대합니다.
2개의 포인터 알고리즘을 사용하면 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)


위 내용은 두 포인터 알고리즘 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.