> 웹 프론트엔드 > JS 튜토리얼 > DSA의 두 포인터 패턴

DSA의 두 포인터 패턴

DDD
풀어 주다: 2025-01-07 18:34:41
원래의
331명이 탐색했습니다.

안녕하세요! DSA의 두 포인터 기술이라는 멋진 트릭에 대해 이야기해 보겠습니다. 걱정하지 마십시오. 재미있게 유지하고 고정하는 데 도움이 되는 몇 가지 시각적 요소를 추가하겠습니다. 뛰어들 준비가 되셨나요?

그럼 이 두 포인터의 정체는 무엇인가요?

필드(배열)의 서로 다른 측면에서 시작하는 두 명의 플레이어(포인터라고 함)가 있는 게임이라고 생각하세요. 다음 중 하나를 수행할 수 있습니다.

  1. 서로를 향해 달려가세요(좀 로맨틱하죠?)
  2. 같은 방향으로 경주하세요(경쟁력 강화!)
  3. 자신만의 일을 해보세요(프리스타일 모드)

이 기술을 사용하면 수많은 루프를 작성하지 않고도 여러 문제를 매우 효율적으로 해결할 수 있습니다. 꽤 깔끔하죠?

왜 신경 써야 하나요?

음, 이는 코드에 있어서 초능력과 같습니다.

  • 빠릅니다: O(n²) 대신 O(n)으로 문제를 해결합니다. 코드가 확대됩니다!
  • 간단합니다. 줄이 적고 이해하기 쉽습니다.
  • 유연함: 배열, 문자열, 심지어 연결된 목록에서도 작동합니다!

두 포인터 문제의 몇 가지 유형을 살펴보겠습니다.

  1. 서로를 향해 움직이는 포인터

정렬된 배열에서 목표에 합산되는 두 개의 숫자를 찾으려고 한다고 상상해 보세요. 마치 두 사람이 중앙에서 만나기 위해 서로를 향해 달려가는 것과 같습니다.

다음은 간단한 JavaScript 예입니다.

function twoSumSorted(arr, target) {
    let left = 0;
    let right = arr.length - 1;
    while (left < right) {
        const sum = arr[left] + arr[right];
        if (sum === target) return [left, right];
        if (sum < target) left++;
        else right--;
    }
    return -1; // No pair found
}

console.log(twoSumSorted([1, 2, 3, 4, 6], 10)); // Output: [2, 4]
로그인 후 복사

숫자가 한 줄에 있는 귀여운 작은 문자라고 상상해 보세요.
① ② ③ ④ ⑤

Two pointer pattern in DSA

  • 왼쪽 포인터는 ①에서 시작됩니다
  • 오른쪽 포인터는 ⑤에서 시작
  • 완벽한 짝을 찾아 천천히 서로를 향해 나아가는 두 사람

2.문자열이 회문인지 확인하는 데 적합합니다. 두 친구가 단어 끝에서 시작하여 중간으로 이동하고 모든 것이 일치하면 하이파이브하는 모습을 상상해 보세요.

function isPalindrome(s) {
    let left = 0;
    let right = s.length - 1;

    while (left < right) {
        if (s[left] !== s[right]) return false;
        left++;
        right--;
    }

    return true;
}

console.log(isPalindrome("racecar")); // Output: true
console.log(isPalindrome("hello"));   // Output: false
로그인 후 복사

'레이스카'라는 단어 위에서 개미 두 마리가 서로를 향해 기어가는 모습을 상상해 보세요.
r <-> ?
<-> ?
c<-> c ?

팰린드롬 확정! ?

이 기술의 몇 가지 멋진 응용:

  1. 목표 합계 찾기(위에서 했던 것처럼)
  2. 두 개의 정렬된 배열 병합
  3. 갇힌 빗물 계산하기(구글에 검색하면 재미있네요!)
  4. 연결된 목록 역전

프로 팁:

  • 먼저 정렬하면 이러한 문제가 훨씬 쉬워질 수 있습니다
  • 특이한 경우(빈 배열, 중복, 극단값)에 주의하세요
  • 스케치해보세요! 배열이나 문자열을 그리면 버그를 방지하는 데 도움이 됩니다

레벨을 올리고 싶으신가요? 다음 과제를 시도해 보세요.

  1. Two Sum II - 입력 배열이 정렬됨(LeetCode 167)
  2. 반복 문자가 없는 가장 긴 부분 문자열(LeetCode 3)
  3. 유효한 Palindrome(LeetCode 125)
  4. 빗물 가두기(LeetCode 42) - 모험심이 느껴진다면!

두 포인터 기술은 코딩에 있어 스위스 군용 칼과 같습니다. 간단하지만 강력하며, 조금만 연습하면 아무 생각 없이 사용하게 될 것입니다.

질문이 있거나 솔루션을 공유하고 싶으십니까? 댓글을 달거나 저에게 소리쳐 주세요. 즐거운 코딩하세요!

위 내용은 DSA의 두 포인터 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿