[LeetCode/Python] 228. Summary Ranges

도니·6일 전

Interview-Prep

목록 보기
37/37
post-thumbnail

📌 Problem

[LeetCode] 228. Summary Ranges

💡 Try & Error

Initial Attempt

  • Append ranges only when a break in consecutiveness occurs
    (연속이 끊기는 지점에서만 range append)
  • Handle last index using conditional checks inside the loop
    (루프 내부에서 i == len(nums) - 1 예외 처리 추가)
  • Result generation dependent on loop execution
    (마지막 range를 루프 안에서 처리하는 구조)

Issue

  • For input size 1 (e.g. nums = [-1]), loop never executes
    (nums = [-1] 같은 길이 1 배열에서 for-loop 미실행)
  • No range appended, resulting in empty output
    (append가 한 번도 발생하지 않아 빈 배열 반환)
  • Loop-dependent logic causing edge case failure
    (루프 의존적인 결과 생성 구조 문제)

Key Insight

  • Separation of "range termination" and "finalization" required
    (연속 구간 문제의 핵심은 "마지막 구간 처리")
  • Intermediate ranges handled inside the loop
    (끊기는 지점은 루프에서 처리)
  • Final range appended after loop completion
    (마지막 구간은 루프 종료 후 무조건 한 번 append)
  • Single-element input handled naturally
    (길이 1 배열 자연스럽게 커버 가능)

📌 Solution

Solution 1: Upgraded Version

Idea

  • Preserve original for-loop structure
  • Append range when consecutiveness breaks
  • Defer last range handling until after loop
  • Ensure coverage for len(nums) == 1

Code

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        if not nums:
            return []

        results = []
        start, end = nums[0], nums[0]
        for i in range(1, len(nums)):
            if nums[i] != nums[i - 1] + 1:
                end = nums[i-1]
                if end == start:
                    results.append(f"{start}")
                else:
                    results.append(f"{start}->{end}")
                start = nums[i]

                if i == len(nums)-1:
                    results.append(f"{start}")
            else:
                if i == len(nums)-1:
                    results.append(f"{start}->{nums[i]}")
            
            print(f"index {i} -> start = {start}, end = {end}, results = {results}")

        return results

Complexity

  • Time Complexity: O(n)O(n)
  • Space Complexity: O(n)O(n) (output 포함)

⭐️ Solution 2: Optimal Version (Two Pointers)

Idea

  • Single-pass two-pointer traversal
  • Expand range while numbers remain consecutive
  • Emit range immediately after expansion ends
  • Minimal branching and clean termination logic

Code

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        if not nums:
            return []
        
        results = []
        start = nums[0]

        for i in range(1, len(nums)):
            if nums[i] != nums[i - 1] + 1:
                end = nums[i - 1]
                if start == end:
                    results.append(str(start))
                else:
                    results.append(f"{start}->{end}")
                start = nums[i]

        end = nums[-1]
        if start == end:
            results.append(str(start))
        else:
            results.append(f"{start}->{end}")

        return results

Complexity

  • Time Complexity: O(n)O(n)
  • Space Complexity: O(1)O(1) extra (output 제외)
profile
Where there's a will, there's a way

0개의 댓글