1. 程式人生 > >【LeetCode】55. Jump Game 解題報告(Python)

【LeetCode】55. Jump Game 解題報告(Python)

目錄

題目描述

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
             jump length is 0, which makes it impossible to reach the last index.

題目大意

每個位置上的數字代表了最多可以向右跳多少步,問能不能跳到最右邊的位置。

解題方法

貪心

這個題的tag是貪心,貪心策略是我們每次都選取最優的策略,然後前面已經選好了的就不用管了。

這個題的貪心方法是,我們使用一個變數reach儲存當前能到達的最後位置索引,那麼在每個位置的時候判斷這個位置能不能到達,即位置的索引大於了reach說明前面無論怎麼走也走不到這個位置,就返回False好了。如果這個位置可以到達,那麼要維護一下這個reach,更新策略是當前位置索引+這個數字代表的能向右走多少步,這個代表了到達當前位置的時候向右能到達的最遠距離,在這個最遠距離以內的任何位置都能到,因為每次跳的步數可以變小的。那麼進行了這麼一次迴圈以後,每個位置都判斷為能到達,所以結果返回True就好了。

時間複雜度是O(N),空間複雜度是O(1).

class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        reach = 0
        for i, num in enumerate(nums):
            if i > reach:
                return False
            reach = max(reach, i +
num) return True

貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來最好的選擇。也就是說,不從整體最優上加以考慮,他所作出的是在某種意義上的區域性最優解。貪心演算法和動態規劃演算法都是由區域性最優匯出全域性最優,這裡不得不比較下二者的區別

貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。 2.由(1)中的介紹,可以知道貪心法正確的條件是:每一步的最優解一定包含上一步的最優解

動態規劃演算法: 1.全域性最優解中一定包含某個區域性最優解,但不一定包含前一個區域性最優解,因此需要記錄之前的所有最優解 2.動態規劃的關鍵是狀態轉移方程,即如何由以求出的區域性最優解來推導全域性最優解 3.邊界條件:即最簡單的,可以直接得出的區域性最優解

相似題目

參考資料

日期

2018 年 10 月 28 日 —— 10月份最後一個週一