位元組跳動演算法題跳躍遊戲

2021-10-25 07:22:41 字數 1405 閱讀 7037

位元組跳動是比較注重演算法類的題目,都必須要手撕**的。這次遇到的題目如下:

55. 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最後乙個位置。

示例 1:

輸入: [2,3,1,1,4]

輸出: true

解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後乙個位置。

示例 2:

輸入: [3,2,1,0,4]

輸出: false

解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後乙個位置。

題目要點

題意並不難,為了能跳到最後一步,可以知道只要陣列最後一位的前面的所有0能跳過,就可以順利到達最後的位置,很自然就會想到乙個演算法,就是從後往前遍歷,當遍歷到0的時候去判斷前面是否存在數字可以跳過當前的0。

如果遍歷完所有0都滿足條件,即可返回true。當其中某個0無法跳過,直接返回false。

時間複雜度分析:最外層向前面遍歷是n,每個0又會去0前面遍歷,所以複雜度肯定是》n。

但是面試官要求複雜度是n才可以。所以平時學習演算法一定要追求最優解,否則實際面試很可能當沒過

再次思考,還是回到最初的結論,每個0都能跳過,那只要前面的數字最遠能跳過的距離大於0即可,所以可以從左到右遍歷,並且儲存這個能跳最遠的值step,每走一步就要減1,遇到當前的值nums[i]比step大,那就把step設定為nums[i]繼續遍歷,遇到0判斷這個step是否等於0,如果等於0,說明無法繼續跳了,如果大於0,即可跳過當前0。

複雜度為n,空間複雜度為1

nums[i]為對應i位置能跳的最大位置, step 為還能跳的最遠距離

2)依次遍歷陣列,step依次減1,遇到nums[i] > step, 則step = nums[i]

3)當前數字為0,如果 step > 0則繼續遍歷,如果step < 0說明無法跳過,返回false

最終**:

public

boolean

canjump

(int

nums)

return

true

;}

總結

幾個要點

思考清楚了再開始動手寫**,不要覺得可能是怎樣就開始寫,否則思緒容易混亂。

如果太簡單,那面試肯定會增加對於最優解複雜度的要求,因此平時刷題的時候一定要重視複雜度的分析與要求一定要在紙張上寫,直接在腦子想效率肯定不高的。

位元組跳動演算法題 馬里奧跳躍

思路 動態規劃 n 7 p 0 maxdis 10,0,2,1,1,0,1 maxdis 2,0,1,1,1,1,1 maxdis 5,0,5,1,1,1,1 dp i 代表當前點到終點的最小跳躍次數 dp 0 for i in range 0,len maxdis for i in range l...

演算法題 8 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fa...

程式設計題 機械人跳躍問題 Golang 位元組跳動

機械人正在玩乙個古老的基於dos的遊戲。遊戲中有n 1座建築 從0到n編號,從左到右排列。編號為0的建築高度為0個單位,編號為i的建築的高度為h i 個單位。起初,機械人在編號為0的建築處。每一步,它跳到下乙個 右邊 建築。假設機械人在第k個建築,且它現在的能量值是e,下一步它將跳到第個k 1建築。...