透析跳躍游戲

關卡名

理解與貪心有關的高頻問題

我會了??

內容

1.理解跳躍游戲問題如何判斷是否能到達終點

??

2.如果能到終點,如何確定最少跳躍次數

??

1. 跳躍游戲?

leetCode 55 給定一個非負整數數組,你最初位于數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度,判斷你是否能夠到達最后一個位置。

示例1:

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

輸出: true

解釋: 從位置 0 到 1 跳 1 步, 然后跳 3 步到達最后一個位置。

示例2:

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

輸出: false

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

如果當前位置元素如果是3,我究竟是跳幾步呢,一步,兩步,還是三步?這里的關鍵是判斷能否到達終點,不用每一步跳躍到哪個位置,而是盡可能的跳躍到最遠的位置,看最多能覆蓋到哪里,只要不斷更新能覆蓋的距離,最后能覆蓋到末尾就行了。

?

例如上面的第一個例子,3能覆蓋的范圍是后面的{2,1,0},2接下來能覆蓋后面的{1,0},而1只能覆蓋到{0},所以無法到達4。
而第二組序列,2能覆蓋{3,1},3可以覆蓋后面的{1,1,4},已經找到一條路了。1只能到下一個1,下一個1能到4,所以這里有{2,1,1,4}和{2,3,1,1,4}兩種走法,加起來有3種跳法。
我們可以定義一個cover表示最遠能夠到達的方位,也就是i每次移動只能在其cover的范圍內移動,每移動一次,cover得到該元素數值(新的覆蓋范圍)的補充,讓i繼續移動下去。而cover每次按照下面的結果判斷。如果cover大于等于了終點下標,直接return true就可以了:
cover= max(該元素數值補充后的范圍, cover本身范圍)
針對上圖的兩個序列再解釋一下:
1.在第二個圖中,第一個元素,nums[0]=2,此時conver=2能覆蓋到{3,1}兩個元素。
2.繼續,第二個元素nums[1]=3,此時能繼續覆蓋的范圍就是1+3,能覆蓋{1,1,4}三個位置。此時cover=2,而”該元素數值補充后的范圍“是1+3=4,所以新的conver=max{4,2},此時就是cover>=nums.length-1。
其他情況都可以使用類似的方式來判斷 ,所以代碼就是:

public boolean canJump(int[] nums) {if (nums.length == 1) {return true;}//覆蓋范圍, 初始覆蓋范圍應該是0,因為下面的迭代是從下標0開始的int cover = 0;//在覆蓋范圍內更新最大的覆蓋范圍for (int i = 0; i <= cover; i++) {cover = Math.max(cover, i + nums[i]);if (cover >= nums.length - 1) {return true;}}return false;
}

這道題目的難點是要想到覆蓋范圍,而不用拘泥于每次究竟跳幾步,覆蓋范圍是可以逐步擴展的,只有能覆蓋就一定是可以跳過來的,不用管是怎么跳的。

2 最短跳躍游戲

在上題再進一步,假設一定能到達末尾,然后讓你求最少到達的步數該怎么辦呢?這就是LeetCode45上面的例子。可以看到,有三種走法{2,3,4}、{2,1,1,4}和{2,3,1,1,4},那這時候該怎么辦呢?
具體該怎么實現呢?網上有很多解釋,代碼也基本雷同,而且也很明顯是將上一題的代碼修改了一下,但是難在不好理解,我現在給一個比較好理解的方式:貪心+雙指針。
我們重新觀察一下結構圖,為了便于分析,我們修改一下元素序列,我們需要四個變量:

  • left用來一步步遍歷數組
  • steps用來記錄到達當前位置的最少步數
  • right表示當前步數下能夠覆蓋到的最大范圍
  • 我們還需要一個臨時變量conver,假如left到達right時才更新right

在這個圖中,開始的元素是 2,如果只走一步,step=1,可跳的范圍是{3,1}。也就是如果只走一步,最遠只能到達1,此時conver=nums[0]=2,因此我們用right=nums[2]來保存這個位置,這表示的就是走一步最遠只能到nums[2]。
接下來,我們必須再走一步,step=2,如下圖,此時可選元素是{3,1}, 3能讓我們到達的距離是left+nums[left]=1+3=4,而1能讓我們到達的位置是left+nums[left]=2+1=3,而所以我們獲得最遠覆蓋距離conver=4 。

然后用left和right將step=2的范圍標記一下:

?此時還沒有到終點,我們要繼續走,在這里我們可選擇的元素是{2,4},如果選擇2,則可以到達left+nums[left]=3+2=5,如果選擇4則是left+nums[left]=4+4=8,已經超越邊界了,所以此時一定將末尾覆蓋了。

這樣我們就知道最少需要走3次。
這個過程怎么用代碼表示呢?看代碼:

public int jump(int[] nums) {int right = 0;int maxPosition = 0;int steps = 0;for(int left=0;i<nums.length;left++){//找能跳的最遠的maxPosition = Math.max(maxPosition,nums[left]+left);if(left==right){ //遇到邊界,就更新邊界,并且步數加一right = maxPosition;steps++;}//right指針到達末尾了。if (right >= nums.length - 1) {return steps;}}return steps;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214531.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信商家收款碼扣多少手續費

很多人想申請低手續費率的收款碼不知從何下手&#xff0c;在參考了大量博客教學之后&#xff0c;終于搞懂了詳細流程以及注意事項。在此記錄一下。我申請的是一個只需要0.2%費率的微信收款碼&#xff0c;申請時間是2022年2月12日。申請之前只需要準備營業執照和法人身份z&#…

JSON在線解析

JSON在線解析及格式化驗證 - JSON.cn JSON在線視圖查看器(Online JSON Viewer)

java中list的addAll用法詳細實例?

List 的 addAll() 方法用于將一個集合中的所有元素添加到另一個 List 中。下面是一個詳細的實例&#xff0c;展示了 addAll() 方法的使用&#xff1a; java Copy code import java.util.ArrayList; import java.util.List; public class AddAllExample { public static v…

設計模式: 關于編程范式的聲明式和命令式編程及應用框架的開發和設計原則

編程范式 命令式編程聲明式編程 上述兩種范式是相對來說的 命令式編程 詳細描述做事過程的方式就可以叫做 命令式例子: 張三媽媽讓張三買食鹽 拿錢&#xff0c;開門&#xff0c;下樓&#xff0c;到商店&#xff0c;付款&#xff0c;帶著食鹽回家 例子&#xff1a;在指定div…

驗證二叉搜索樹[中等]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給你一個二叉樹的根節點root&#xff0c;判斷其是否是一個有效的二叉搜索樹。有效 二叉搜索樹定義如下&#xff1a; 【1】節點的左子樹只包含 小于 當前節點的數。 【2】節點的右子樹只包含 大于 當前節點的數。 【3】所有左子樹和右…

Leetcode 40 組合總和 II

題意理解&#xff1a; 每個數字在每個組合中只能使用 一次 數字可以重復——>難點&#xff08;如何去重&#xff09; 每個組合和target 求組合&#xff0c;對合限制&#xff0c;考慮回溯的方法。——將其抽象為樹結構。 樹的寬度——分支大小 樹的深度——最…

Spring IoC和DI

目錄 一. Spring是什么 IoC DI 二. IoC&DI的使用 IoC 1.Controller&#xff08;控制器存儲&#xff09; 2.Service&#xff08;服務存儲&#xff09; 3.Repository&#xff08;倉庫存儲&#xff09; 4.Componemt&#xff08;組件存儲&#xff09; 5.Configuratio…

解決Could not establish connection to : XHR failed

解決Could not establish connection to : XHR failed 問題描述 用vscode用遠程連接服務器時總報上面的錯誤&#xff0c;用xshell和Xftp和vscode終端都可以連上&#xff0c;但是用vscode的ssh連接缺總報錯&#xff0c;導致無法連接服務器進行代碼調試 一、原因 原因可能是在…

【MATLAB】 數據、矩陣、行、列翻轉

1.MATLAB函數fliplr 用法&#xff1a;fliplr(X) 功能&#xff1a;matlab中的fliplr函數實現矩陣的左右翻轉。 fliplr(X)使矩陣X沿垂直軸左右翻轉。 相關函數&#xff1a;flipud函數可以實現矩陣的上下翻轉。 備注&#xff1a;matlab中提供了許多對矩陣操作的函數&#xff0c;可…

Go json 差異比較 json-diff(RFC6902)

Go json 差異比較 json-diff(RFC 6902) 畢業設計中過程中為了比較矢量圖的差異而依據 RFC 6902 編寫的一個包&#xff0c;現已開源&#xff1a; Json-diff 使用 go get -u github.com/520MianXiangDuiXiang520/json-diff序列化與反序列化 與官方 json 包的序列化和反序列化不…

后端開發面試題

這是一波今年7月份的大廠面試題&#xff0c;分享下&#xff5e;&#xff5e; Mybatis三級緩存 Mybatis懶加載 分布式事務 transaction gradle和maven區別 抽象類、多態 Springboot啟動 ConcurrentHashMap 樂觀鎖、悲觀鎖 docker k8s常用命令 電商業務從什么維度分庫分…

AcWing 95. 費解的開關(遞推)

題目鏈接 活動 - AcWing 本活動組織刷《算法競賽進階指南》&#xff0c;系統學習各種編程算法。主要面向有一定編程基礎的同學。https://www.acwing.com/problem/content/97/ 題解 只要第一行開關的狀態確定&#xff0c;則所有開關的狀態都可以被推出來。第一行開關總共有種操…

jemeter,同一線程組內,調用cookie實現接口關聯

取cookie方式參考上一篇&#xff1a;jemeter&#xff0c;取“臨時重定向的登錄接口”響應頭中的cookie-CSDN博客 元件結構 登錄后要執行的接口為“api/get_event_list/”&#xff0c;在該HTTP請求下創建HTTP信息頭管理器&#xff0c;配置如下&#xff1a; 執行測試后&#xff0…

【ensp實踐】eNSP實戰篇(4)用eNSP實驗來認識什么是OSPF及OSPF配置?

OSPF目錄 寫在前面涉及知識一、什么是OSPF&#xff1f;二、OSPF特性&#xff08;優缺點&#xff09;2.1 OSPF優點2.2 OSPF缺點 三、OSPF實驗3.1 打開ensp&#xff0c;添加設備3.2 建立連線3.3 配置及ospf命令【核心】3.3.1 配置PC機3.3.2 設置命令 3.4 驗證效果3.4.1、驗證OSPF…

Spring IoC如何存取Bean對象

小王學習錄 IoC(Inversion of Control)1. 什么是IoC2. 什么是Spring IoC3. 什么是DI4. Spring IoC的作用 存儲Bean對象1. 創建Bean2. 將Bean注冊到Spring中. 取Bean對象.1. 獲取Spring上下文信息使用ApplicationContext和BeanFactory的區別 2. 獲取指定Bean對象 IoC(Inversion …

使用JLink仿真器實現調試打印的N種方法

方法一&#xff1a;使用MCU的串口 這是最古老也是最簡單的方法。 電腦上面插一個USB轉TTL&#xff0c;然后與MCU的UART_RX/UART_TX/GND連接起來。PC端再打開一個串口調試助手。兩邊的波特率一致&#xff0c;就可以收到MCU發過來的打印信息了。 方法二&#xff1a;使用JLink仿…

【EMNLP 2023】面向Stable Diffusion的自動Prompt工程算法

近日&#xff0c;阿里云人工智能平臺PAI與華南理工大學朱金輝教授團隊合作在自然語言處理頂級會議EMNLP2023上發表了BeautifulPrompt的深度生成模型&#xff0c;可以從簡單的圖片描述中生成高質量的提示詞&#xff0c;從而使文生圖模型能夠生成更美觀的圖像。BeautifulPrompt通…

Android--Jetpack--Databinding源碼解析

慢品人間煙火色&#xff0c;閑觀萬事歲月長 一&#xff0c;基本使用 關于databinding的基本使用請看之前的文章 Android--Jetpack--Databinding詳解-CSDN博客 二&#xff0c;xml布局解析 分析源碼呢&#xff0c;主要就是從兩方面入手&#xff0c;一個是使用&#xff0c;一個…

STM32F407-14.1.0-01高級定時器簡介

TIM1 和 TIM8 簡介 高級控制定時器&#xff08;TIM1 和 TIM8&#xff09;包含一個 16 位自動重載計數器&#xff0c;該計數器由可編程預分頻器驅動。 此類定時器可用于各種用途&#xff0c;包括測量輸入信號的脈沖寬度&#xff08;輸入捕獲&#xff09;&#xff0c;或者生成輸出…