45. Jump Game 2

1515 단어 algorithmDPDP


https://leetcode.com/problems/jump-game-ii/

DP list에 각 nums 인덱스에 도달할 수 있는 최소 회수를 저장하도록 함

class Solution:
    def jump(self, nums: List[int]) -> int:
        INF = 1e9
        length = len(nums)
        
        dp = [INF for i in range(length)]
        dp[0] = 0
        
        for i in range(length-1):
            now = nums[i]
            for dx in range(now):
                dx+=1
                if i + dx < length:
                    dp[i+dx] = min(dp[i+dx], dp[i] +1)
        
        return dp[-1]

문제는 실행시간이 끔찍하게 느리다는 점.

문제점 1. if로 length 를 넘는지를 계속 체크한다 -> 그냥 maximum list 사이즈를 확인한 후 dp list를 선언하면 length면 되는걸 length*평균(nums) 만큼 if를 더 태워버린 꼴

문제점 2. 애초에 이런 방식으로는 O(length * 평균(nums))임. 다른 방법을 찾아보니 시간복잡도 O(length)만으로 되는 코드를 발견

class Solution:
    def jump(self, nums: List[int]) -> int:
        last_index = len(nums) - 1
        max_reachable=[start_pos+nums[start_pos] for start_pos in range(last_index)]
        jump_range = (0, 0)
        n_jumps = 0
        while jump_range[1] < last_index:
            n_jumps += 1
            jump_range = (jump_range[1], 
            				max(max_reachable[jump_range[0]:jump_range[1]+1]))
        return n_jumps

각 time step 마다 도달할 수 있는 최대거리를 dp list에 저장하는 방식

좋은 웹페이지 즐겨찾기