LeetCode/LeetCode75

[LeetCode 75] Medium - 334. Increasing Triplet Subsequence ☆

hyunkookim 2024. 11. 12. 15:07

334. Increasing Triplet Subsequence

 

Given an integer array nums, return true if there exists a triple of indices (i, j, k) such that i < j < k and nums[i] < nums[j] < nums[k]. If no such indices exists, return false.

 

Example 1:

Input: nums = [1,2,3,4,5]
Output: true
Explanation: Any triplet where i < j < k is valid.

Example 2:

Input: nums = [5,4,3,2,1]
Output: false
Explanation: No triplet exists.

Example 3:

Input: nums = [2,1,5,0,4,6]
Output: true
Explanation: The triplet (3, 4, 5) is valid because nums[3] == 0 < nums[4] == 4 < nums[5] == 6.

 

Constraints:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

 

Follow up: Could you implement a solution that runs in O(n) time complexity and O(1) space complexity?

 

문제 풀이

 

이 문제는 **주어진 정수 배열 nums에서 오름차순의 3개의 숫자 (트리플릿)**를 찾는 문제입니다. 세 개의 숫자는 서로 다른 위치에 있어야 하며, 다음 조건을 만족해야 합니다:

 

문제 풀이

제약 조건

  1. 시간 복잡도: O(n)
    • 배열을 한 번 순회하며 해결해야 합니다.
  2. 공간 복잡도: O(1)
    • 추가 배열이나 자료구조를 사용하지 않고 변수만 사용 해야 함

 

풀이 방법

탐욕적 접근법을 사용하여 nums[i] < nums[j] < nums[k] 를 만족하는 세 숫자를 찾습니다:

  1. 두 개의 최소값 유지:
    • 작은 값 first와 두 번째로 작은 값 second를 저장합니다.
    • 배열을 순회하면서:
      • 현재 숫자가 first보다 작으면 first를 업데이트.
      • 현재 숫자가 first보다 크고 second보다 작으면 second를 업데이트.
      • 현재 숫자가 second보다 크면 조건을 만족하는 nums[i] < nums[j] < nums[k] 를 찾은 것입니다.

 

https://youtu.be/Nqht7TDjItM?si=PT39U2RQcQGB9p0f

 

 

 

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        # n1: 첫 번째로 작은 숫자 (현재까지 찾은 최솟값)
        # n2: 두 번째로 작은 숫자 (n1보다 크고, 현재까지 찾은 두 번째로 작은 값)
        n1, n2 = float("inf"), float("inf")

        # 배열을 순회하며 트리플릿을 찾음
        for n in nums:
            # 조건: 현재 숫자 n이 n2보다 크다면, n1 < n2 < n이 성립
            if n > n2:
                return True  # 조건을 만족하는 트리플릿을 찾았으므로 True 반환

            # n이 n1보다 작거나 같으면 n1을 업데이트 (최솟값 갱신)
            if n <= n1:
                n1 = n
            # n이 n1보다 크고, n2보다 작거나 같으면 n2를 업데이트
            elif n <= n2:  # 즉, n1 < n <= n2인 경우
                n2 = n

        # 순회가 끝날 때까지 조건을 만족하는 트리플릿이 없으면 False 반환
        return False