自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LeetCode題解之跳躍游戲

開(kāi)發(fā) 前端
給定一個(gè)非負(fù)整數(shù)數(shù)組 nums ,你最初位于數(shù)組的 第一個(gè)下標(biāo) 。數(shù)組中的每個(gè)元素代表你在該位置可以跳躍的最大長(zhǎng)度。判斷你是否能夠到達(dá)最后一個(gè)下標(biāo)。

[[387128]]

前言

周五了,和大家玩?zhèn)€跳躍游戲

題目

給定一個(gè)非負(fù)整數(shù)數(shù)組 nums ,你最初位于數(shù)組的 第一個(gè)下標(biāo) 。

數(shù)組中的每個(gè)元素代表你在該位置可以跳躍的最大長(zhǎng)度。

判斷你是否能夠到達(dá)最后一個(gè)下標(biāo)。

示例 1:輸入:nums = [2,3,1,1,4] 輸出:true

解釋?zhuān)嚎梢韵忍?1 步,從下標(biāo) 0 到達(dá)下標(biāo) 1, 然后再?gòu)南聵?biāo) 1 跳 3 步到達(dá)最后一個(gè)下標(biāo)。

示例 2:輸入:nums = [3,2,1,0,4] 輸出:false

解釋?zhuān)簾o(wú)論怎樣,總會(huì)到達(dá)下標(biāo)為 3 的位置。但該下標(biāo)的最大跳躍長(zhǎng)度是 0 , 所以永遠(yuǎn)不可能到達(dá)最后一個(gè)下標(biāo)。

分析

簡(jiǎn)單分析一下,由題目得出,要想到達(dá)最后一個(gè)下標(biāo),得滿(mǎn)足兩個(gè)條件:

  • 1、假設(shè)每個(gè)位置都能跳到,那么我們只需要遍歷數(shù)組,看看有沒(méi)有位置能直接通過(guò)這個(gè)位置上的數(shù)字跳到結(jié)尾。

比如[2,3,2,1,4],我們遍歷數(shù)字,看看哪個(gè)位置可以跳到最后,可以發(fā)現(xiàn)第三個(gè)位置的數(shù)字是2,所以可以通過(guò)第三個(gè)位置跳到最后的下標(biāo),數(shù)組成立。

  • 2、上述假設(shè)成立的還有個(gè)條件就是 每個(gè)位置是否都能跳到。

比如[2,0,2,1,4],按照上面的邏輯,第三個(gè)位置是可以跳到最后下標(biāo)。但是,第三個(gè)位置是否能到達(dá)呢?如果第三個(gè)位置都到不了,那又何談最后的位置呢?在這個(gè)例子中,第一個(gè)位置為2,是可以跳到第三個(gè)位置的。

如果改成[1,0,2,1,4],第三個(gè)位置就到不了了。

結(jié)合上述分析,我們可以得出以下解法:

  1. public boolean canJump(int[] nums) { 
  2.         //能到達(dá)的最大位置k 
  3.         int k =0; 
  4.         //遍歷數(shù)組 
  5.         for(int i=0;i<nums.length;i++){ 
  6.             //如果達(dá)不到i位置,就直接返回false 
  7.             if(k<i) return false
  8.             k=Math.max(k,i+nums[i]); 
  9.         } 
  10.         return true
  11.     } 

也可以在每次獲取k之后再判斷一次,如果滿(mǎn)足條件就直接返回,減少循環(huán)次數(shù):

  1. public boolean canJump(int[] nums) { 
  2.         //能到達(dá)的最大位置k 
  3.         int k =0; 
  4.         //獲取數(shù)組長(zhǎng)度 
  5.         int l = nums.length; 
  6.         //遍歷數(shù)組 
  7.         for(int i=0;i<l;i++){ 
  8.             if(k<i) return false
  9.             k=Math.max(k,i+nums[i]); 
  10.             if (k >= l-1) { 
  11.              return true
  12.             } 
  13.         } 
  14.         return false
  15.     } 

這種在到了某個(gè)位置,作出當(dāng)前最好的選擇 的算法一般稱(chēng)為貪心算法。

貪心算法的思路就是把問(wèn)題分為若干個(gè)子問(wèn)題,然后針對(duì)每個(gè)子問(wèn)題進(jìn)行局部求解,最終得到整個(gè)問(wèn)題的解。

貪心算法主要有兩個(gè)特點(diǎn):

  • 總是作出在當(dāng)前看來(lái)最好的選擇。
  • 從局部的最優(yōu)選擇到整體最優(yōu)解。

所以“貪心”的意思大概就是目光短淺,只看到到眼前的最好,而不會(huì)從整體的角度思考。

雖然不能保證最后的解法是最優(yōu)的,但是這種辦法確實(shí)是能夠解決問(wèn)題的,將大問(wèn)題化解成小問(wèn)題,小問(wèn)題好好解決。

那有什么時(shí)候會(huì)有更好的解呢?這就引出 動(dòng)態(tài)規(guī)劃了。

動(dòng)態(tài)規(guī)劃的思想同樣是解決子問(wèn)題,但是每一步的選擇都會(huì)依賴(lài)于相關(guān)的子問(wèn)題解,所以有時(shí)候的復(fù)雜問(wèn)題選擇動(dòng)態(tài)規(guī)劃能有更好的解法,因?yàn)樗麑?duì)于子問(wèn)題間的相關(guān)性更強(qiáng)。

就等下次聊了,拜拜。

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(1)

參考

https://blog.csdn.net/qq_42363032/article/details/103597453

https://leetcode-cn.com/problems/jump-game/submissions/

本文轉(zhuǎn)載自微信公眾號(hào)「碼上積木」,作者積木zz 。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼上積木公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼上積木
相關(guān)推薦

2021-01-21 08:23:29

鏈表單鏈表循環(huán)鏈表

2021-02-04 08:18:53

LeetCode鏈表

2021-01-22 08:30:50

LeetCode數(shù)字數(shù)組

2021-03-22 08:23:29

LeetCode二叉樹(shù)節(jié)點(diǎn)

2021-01-28 08:20:41

鏈表空間復(fù)雜度

2021-11-16 11:32:55

開(kāi)發(fā)跳躍游戲

2021-02-03 13:23:42

鏈表倒數(shù)結(jié)點(diǎn)

2020-01-17 18:40:38

Python游戲代碼

2021-03-02 08:21:58

LeetCode括號(hào)

2021-01-15 08:19:26

二維數(shù)組LeetCode

2021-03-17 08:19:22

二叉樹(shù)LeetCode樹(shù)

2012-07-11 10:09:20

Android惡意軟件

2021-12-01 09:00:57

LeetCode回文數(shù)字算法

2021-12-31 09:01:44

LeetCode 羅馬數(shù)字四數(shù)之和

2014-09-01 10:36:35

個(gè)推推送

2017-03-29 11:08:36

游戲日志分析

2021-08-03 10:24:59

數(shù)據(jù)跳躍鏈表結(jié)構(gòu)

2022-02-11 09:42:21

Swift開(kāi)發(fā)語(yǔ)言LeetCode

2022-10-12 09:01:11

動(dòng)態(tài)規(guī)劃算法題

2022-02-11 09:01:45

LeetCode函數(shù)括號(hào)生成
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)