> 웹 프론트엔드 > JS 튜토리얼 > Typescript Coding Chronicles: 삼중항 하위 시퀀스 증가

Typescript Coding Chronicles: 삼중항 하위 시퀀스 증가

WBOY
풀어 주다: 2024-07-17 21:13:42
원래의
1122명이 탐색했습니다.

Typescript Coding Chronicles: Increasing Triplet Subsequence

문제 설명:

정수 배열 nums가 주어지면 i < j < k 및 nums[i] < 숫자[j] < 숫자[k]. 해당 인덱스가 없으면 false를 반환합니다.

예시 1:

  • 입력: 숫자 = [1,2,3,4,5]
  • 출력: true
  • 설명: i < j < k는 유효합니다.

예시 2:

  • 입력: 숫자 = [5,4,3,2,1]
  • 출력: 거짓
  • 설명: 삼중항이 존재하지 않습니다.

예시 3:

  • 입력: 숫자 = [2,1,5,0,4,6]
  • 출력: true
  • 설명: 세 쌍(3, 4, 5)은 nums[3] == 0 < 숫자[4] == 4 < 숫자[5] == 6.

제약:

  • 1 <= nums.length <= 5 * 10^5
  • -2^31 <= 숫자[i] <= 2^31 - 1

후속 조치:

O(n) 시간 복잡도와 O(1) 공간 복잡도에서 실행되는 솔루션을 구현할 수 있나요?

초기 사고 과정:

이 문제를 효율적으로 해결하려면 지금까지 발생한 가장 작은 값과 두 번째로 작은 값을 추적해야 합니다. 두 번째로 작은 값보다 큰 세 번째 값을 찾으면 증가하는 삼중항을 찾은 것입니다.

기본 솔루션(무차별 대입):

무차별 대입 솔루션은 가능한 모든 삼중항을 검사하여 조건 i < j < k 및 nums[i] < 숫자[j] < 숫자[k]. 이 접근 방식은 O(n^3)의 시간 복잡도를 가지므로 큰 입력 크기에는 효율적이지 않습니다.

암호:

function increasingTripletBruteForce(nums: number[]): boolean {
    const n = nums.length;
    for (let i = 0; i < n - 2; i++) {
        for (let j = i + 1; j < n - 1; j++) {
            for (let k = j + 1; k < n; k++) {
                if (nums[i] < nums[j] && nums[j] < nums[k]) {
                    return true;
                }
            }
        }
    }
    return false;
}
로그인 후 복사

시간 복잡도 분석:

  • 시간 복잡도: O(n^3), 여기서 n은 배열의 길이입니다. 가능한 모든 세쌍둥이를 검사하고 있기 때문입니다.
  • 공간 복잡도: O(1), 추가 공간을 사용하지 않기 때문입니다.

제한사항:

무차별 대입 솔루션은 효율적이지 않으며 큰 입력 크기에 적합하지 않습니다.

최적화된 솔루션:

최적화된 솔루션에는 지금까지 발견된 가장 작은 값과 두 번째로 가장 작은 값을 나타내는 두 개의 변수인 첫 번째와 두 번째를 유지하면서 배열을 반복하는 작업이 포함됩니다. 초보다 큰 값을 찾으면 true를 반환합니다.

암호:

function increasingTriplet(nums: number[]): boolean {
    let first = Infinity;
    let second = Infinity;

    for (let num of nums) {
        if (num <= first) {
            first = num; // smallest value
        } else if (num <= second) {
            second = num; // second smallest value
        } else {
            return true; // found a value greater than second smallest, thus an increasing triplet exists
        }
    }

    return false;
}
로그인 후 복사

시간 복잡도 분석:

  • 시간 복잡도: O(n), 여기서 n은 배열의 길이입니다. 배열을 한 번 반복합니다.
  • 공간 복잡성: O(1), 일정한 양의 추가 공간만 사용하기 때문입니다.

기본 솔루션에 비해 개선된 사항:

  • 이 솔루션은 선형 시간으로 실행되고 일정한 공간을 사용하므로 주어진 제약 조건에 최적입니다.

엣지 케이스 및 테스트:

엣지 케이스:

  1. 배열은 내림차순입니다.
  2. 배열에는 정확히 3개의 요소가 오름차순으로 포함되어 있습니다.
  3. 배열에 증가하는 삼중항이 없는 많은 수의 요소가 있습니다.
  4. 배열에 중복된 항목이 있습니다.

테스트 사례:

console.log(increasingTripletBruteForce([1,2,3,4,5])); // true
console.log(increasingTripletBruteForce([5,4,3,2,1])); // false
console.log(increasingTripletBruteForce([2,1,5,0,4,6])); // true
console.log(increasingTripletBruteForce([1,1,1,1,1])); // false
console.log(increasingTripletBruteForce([1,2])); // false
console.log(increasingTripletBruteForce([1,2,3])); // true
console.log(increasingTripletBruteForce([1,5,0,4,1,3])); // true

console.log(increasingTriplet([1,2,3,4,5])); // true
console.log(increasingTriplet([5,4,3,2,1])); // false
console.log(increasingTriplet([2,1,5,0,4,6])); // true
console.log(increasingTriplet([1,1,1,1,1])); // false
console.log(increasingTriplet([1,2])); // false
console.log(increasingTriplet([1,2,3])); // true
console.log(increasingTriplet([1,5,0,4,1,3])); // true
로그인 후 복사

일반적인 문제 해결 전략:

  1. 문제 이해: 문제 설명을 주의 깊게 읽고 요구 사항과 제약 조건을 이해하세요.
  2. 키 작업 식별: 가장 작은 값과 두 번째로 작은 값을 추적하는 등 필요한 키 작업을 결정합니다.
  3. 효율성을 위한 최적화: 효율적인 알고리즘과 데이터 구조를 사용하여 시간과 공간의 복잡성을 최소화합니다.
  4. 철저한 테스트: 엣지 케이스를 포함한 다양한 케이스로 솔루션을 테스트하여 정확성을 확인하세요.

유사한 문제 식별:

  1. 하위 배열 문제:

    • 특정 속성을 가진 하위 배열을 찾아야 하는 문제.
    • 예: 최대 합 하위 배열 찾기(Kadane 알고리즘)
  2. 2점슛 기법:

    • 두 개의 포인터를 사용하는 문제는 솔루션을 최적화하는 데 도움이 될 수 있습니다.
    • 예: 정렬된 배열에서 중복 항목 제거
  3. 내부 알고리즘:

    • 제한된 추가 공간에서 작업을 수행해야 하는 문제
    • 예: 배열을 오른쪽으로 k만큼 회전

결론:

  • 증가하는 삼중항 부분 수열을 찾는 문제는 무차별 대입 접근 방식과 선형 시간 및 일정한 공간 복잡도를 갖춘 최적화된 솔루션을 사용하여 효율적으로 해결할 수 있습니다.
  • 문제를 이해하고 관리 가능한 부분으로 나누는 것이 중요합니다.
  • 효율적인 알고리즘을 사용하면 솔루션이 대규모 입력에 최적화됩니다.
  • 다양한 엣지 케이스로 테스트하여 견고성을 보장합니다.
  • 문제의 패턴을 인식하면 다른 문제에 유사한 솔루션을 적용하는 데 도움이 될 수 있습니다.

이러한 문제와 전략을 연습함으로써 문제 해결 능력을 향상시키고 다양한 코딩 과제에 더 잘 대비할 수 있습니다.

위 내용은 Typescript Coding Chronicles: 삼중항 하위 시퀀스 증가의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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