leetcode 55. 跳躍游戲 思考分析

題目

給定一個非負整數數組,你最初位于數組的第一個位置。

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

判斷你是否能夠到達最后一個位置。

示例1:

輸入: [2,3,1,1,4]
輸出: true
解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然后再從位置 1 跳 3 步到達最后一個位置。

示例2:

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

思考

這個題目,需要注意每個元素代表你在該位置可以跳躍的最大長度,而不是長度。也就是說如果是3,那么你可以走0,1,2,3步。
其次,觀察題目,不能到達最后一格的原因是:某一格元素為0,且之前沒有足夠步數跨越這個0
來分析一下示例2:[3,2,1,0,4],連續的0個數為1
我們先遍歷,找到元素0,下標為3。此刻從它前面的一個元素開始往前遍歷:
下標為2的元素為1,步數為1,(步數 - (連續0的第一個下標 - 當前下標 - 1)) =(1 - (3-2 -1))=1 <= 連續的0個數,所以不行
下標為1的元素為2,步數為2,(步數 - (連續0的第一個下標 - 當前下標 - 1)) =(2 - (3-1 -1))=1 <= 連續的0個數,所以不行
下標為0的元素為3,步數為3,(步數 - (連續0的第一個下標 - 當前下標 - 1)) =(3 - (3-0 -1))=1 <= 連續的0個數,所以不行

所以我們可以歸納出一個明顯的特征:(步數 - (連續0的第一個下標 - 當前下標 - 1))> 連續的0個數
只有滿足這個特征才算是可以到達最后一個位置。
代碼實現的時候還需要考慮特殊情況以及細節:
1、長度為1,直接為true
2、遍歷從 i=1開始,i= nums.size()-1,結束
3、獲取連續0的個數:

int succesive_zero = 0;
if(nums[i] == 0)
{succesive_zero = 1;for(int j = i;j < nums.size()-2;j++){if(nums[j] == 0 && nums[j+1] == 0) succesive_zero++;else break;}
}

4、如果找到了可以可以跨越連續0的步數,那么將i指針移動到跳躍的格子。并且,如果在連續0之前沒有找到足夠大的步數跳躍,則說明不能到達最后一個格子,但是找到了,還需要遍歷之后的情況,直到整個數組都被遍歷了,且沒有出現不能跳過的情況,我們才能返回true。

int flag = 0;
for(int j = i-1;j >= 0;j--)
{if((nums[j]-(i-j-1)) > succesive_zero){i=i+succesive_zero;flag=1;break;}
}
if(flag == 0) return false;

AC代碼

class Solution {
public:bool canJump(vector<int>& nums) {if(nums.size() == 1) return true;if(nums[0] == 0) return false;for(int i=1;i < nums.size()-1;i++){//如果當前為0,記錄連續0的個數int succesive_zero = 0;if(nums[i] == 0){succesive_zero = 1;for(int j = i;j < nums.size()-2;j++){if(nums[j] == 0 && nums[j+1] == 0) succesive_zero++;else break;}//cout<< "succesive_zero"<<succesive_zero << endl;//判斷i之前有沒有步數,在走到i后還有剩余的步數跳過這個0,說明暫時可以,否則不行int flag = 0;for(int j = i-1;j >= 0;j--){if((nums[j]-(i-j-1)) > succesive_zero){i=i+succesive_zero;flag=1;break;}}if(flag == 0) return false;}}return true;}
};

在這里插入圖片描述

參考,貪心思路,思路更加直觀,代碼邏輯更加簡單

參考代碼隨想錄的思路:https://mp.weixin.qq.com/s/606_N9j8ACKCODoCbV1lSA
跳幾步無所謂,關鍵在于可跳的范圍:
每次取最大的跳躍步數,這個就是跳躍的覆蓋范圍。
問題轉化為跳躍覆蓋范圍究竟可不可以覆蓋到終點。
每次移動取最大跳躍步數(得到最大覆蓋范圍),每移動一個單位,就更新最大覆蓋范圍。

**局部最優解:**每次取最大跳躍步數
**整體最優解:**最后得到整體最大覆蓋范圍,看是否能到終點。
在這里插入圖片描述
編程細節:
1、i只能在cover范圍內移動,每移動一個元素,cover得到該元素數值,補充覆蓋范圍,讓i繼續移動下去。
2、cover每次只取max(鈣元素數值補充后的范圍,cover本身范圍)
3、如果cover >= 終點下標,直接return true;
AC代碼:

class Solution {
public:bool canJump(vector<int>& nums) {//初始化覆蓋范圍int cover = 0;if(nums.size() == 1) return true;//從0開始的覆蓋范圍迭代for(int i = 0; i <= cover;i++){cover = max(i+nums[i],cover);if(cover >= nums.size() - 1) return true; }return false;}
};

有一說一,這個思路確實妙!也很符合貪心的邏輯。

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

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

相關文章

六、項目實戰---識別貓和狗

一、準備數據集 kagglecatsanddogs網上一搜一大堆&#xff0c;這里我就不上傳了&#xff0c;需要的話可以私信 導包 import os import zipfile import random import shutil import tensorflow as tf from tensorflow.keras.optimizers import RMSprop from tensorflow.kera…

修改shell終端提示信息

PS1&#xff1a;就是用戶平時的提示符。PS2&#xff1a;第一行沒輸完&#xff0c;等待第二行輸入的提示符。公共設置位置:/etc/profile echo $PS1可以看到當前提示符設置例如&#xff1a;顯示綠色&#xff0c;并添加時間和shell版本export PS1"\[\e[32m\][\uyou are right…

java 字謎_計算字謎的出現次數

java 字謎Problem statement: 問題陳述&#xff1a; Given a string S and a word C, return the count of the occurrences of anagrams of the word in the text. Both string and word are in lowercase letter. 給定一個字符串S和一個單詞C &#xff0c;返回該單詞在文本…

Origin繪制熱重TG和微分熱重DTG曲線

一、導入數據 二、傳到Origin中 三、熱重TG曲線 temp為橫坐標、mass為縱坐標 繪制折線圖 再稍微更改下格式 字體加粗&#xff0c;Times New Roman 曲線寬度設置為2 橫縱坐標數值格式為Times New Roman 根據實際情況改下橫縱坐標起始結束位置 四、微分熱重DTG曲線 點擊曲線…

【嵌入式系統復習】嵌入式網絡與協議棧

目錄開放式系統互連模型總線通信的報文組形式以及傳遞方式報文組形式報文傳遞方式網絡分配與調度嵌入式TCP/IP藍牙技術藍牙的節能狀態糾錯方案藍牙協議棧開放式系統互連模型 ISO/OSI七層模型展示了網絡結構與各層的功能。 應用層&#xff1a; 提供了終端用戶程序和網絡之間的應…

代碼兼容、技巧

代碼兼容、技巧 前端開發中&#xff0c;一個頭疼的事&#xff0c;就是代碼的不兼容&#xff0c;這里貼出自己在前端開發中的一些解決經驗。除了其瀏覽器本身的BUG外&#xff0c;不建議使用CSS hack來解決兼容性問題的。 IE和FF下對”li“的的高度解析不同 可以不定義高度&#…

Windows Phone 7 自定義事件

在Windows Phone的應用開發里面&#xff0c;對于事件這種東西我們可以隨處可見&#xff0c;系統本來就已經封裝好了各種各樣的事件機制&#xff0c;如按鈕的單擊事件等等的。在實際的開發中&#xff0c;我們需要自己去給相關的類自定義一些事件來滿足業務的要求&#xff0c;特別…

getcwd函數_PHP getcwd()函數與示例

getcwd函數PHP getcwd()函數 (PHP getcwd() function) The full form of getcwd is "Get Current Working Directory", the function getcwd() is used to get the name of the current working directory, it does not accept any parameter and returns the curren…

十四、數據庫的導出和導入的兩種方法

一、以SQL腳本格式導出&#xff08;推薦&#xff09; 導出 右擊需要導出的數據庫&#xff0c;任務—>生成腳本 下一步 選擇要導出的數據庫&#xff0c;下一步 內容根據需求修改&#xff0c;沒啥需求直接下一步 勾選 表 勾選需要導出的數據庫中的表 選擇腳本保存的路…

Apache中 RewriteCond 規則參數介紹

RewriteCond就像我們程序中的if語句一樣&#xff0c;表示如果符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句&#xff0c;這就是RewriteCond最原始、基礎的功能&#xff0c;為了方便理解&#xff0c;下面來看看幾個例子。RewriteEngine onRewriteCond %{HTT…

【C++grammar】文件I/O流的基本用法

目錄1、輸入輸出類介紹1.C/C文件操作對比2.什么是流&#xff1f;3.C I/O流類層次4.帶緩沖的輸入輸出5.gcc編譯器cin.in_avail()2、向文件寫入數據1.寫文件小練習2.如何將信息同時輸出到文件和屏幕&#xff1f;3、從文件讀數據1.檢測文件是否成功打開2.檢測是否已到文件末尾3.讀…

作業2 分支循環結構

書本第39頁 習題2 1.輸入2個整數num1和num2.計算并輸出它們的和&#xff0c;差&#xff0c;積&#xff0c;商&#xff0c;余數。 //輸入2個整數num1和num2.計算并輸出它們的和&#xff0c;差&#xff0c;積&#xff0c;商&#xff0c;余數。//#include<stdio.h> int main…

求一個序列中最大的子序列_最大的斐波那契子序列

求一個序列中最大的子序列Problem statement: 問題陳述&#xff1a; Given an array with positive number the task to find the largest subsequence from array that contain elements which are Fibonacci numbers. 給定一個具有正數的數組&#xff0c;任務是從包含菲波納…

十三、系統優化

系統整體框架圖 程序運行進入紡織面料庫存管理系統主頁面 用戶子系統功能演示&#xff1a; 1&#xff0c;點擊用戶登錄進入用戶登錄頁面&#xff0c;可以注冊和找回密碼 2&#xff0c;注冊新用戶&#xff0c;賬號、密碼、性別、手機號均有限制&#xff0c;用戶注冊需要按指定…

時間工具類[DateUtil]

View Code 1 package com.ly.util;2 3 import java.text.DateFormat;4 import java.text.ParseException;5 import java.text.SimpleDateFormat;6 import java.util.Calendar;7 import java.util.Date;8 9 /**10 * 11 * 功能描述12 * 13 * authorAdministrator14 * Date Jul 19…

JQuery delegate多次綁定的解決辦法

我用delegate來控制分頁&#xff0c;查詢的時候會造成多次綁定 //前一頁、后一頁觸發 1 $("body").delegate("#tableFoot a:not(a.btn)", "click", function () { 2 _options.page $(this).attr("page"); 3 loadTmpl(_option…

leetcode 45. 跳躍游戲 II 思考分析

題目 給定一個非負整數數組&#xff0c;你最初位于數組的第一個位置。 數組中的每個元素代表你在該位置可以跳躍的最大長度。 你的目標是使用最少的跳躍次數到達數組的最后一個位置。 示例: 輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最后一個位置的最小跳躍數是 2。 從下標為 …

C程序實現冒泡排序

Bubble Sort is a simple, stable, and in-place sorting algorithm. 氣泡排序是一種簡單&#xff0c;穩定且就地的排序算法。 A stable sorting algorithm is the one where two keys having equal values appear in the same order in the sorted output array as it is pre…

一、爬蟲基本概念

一、爬蟲根據使用場景分類 爬蟲&#xff1a; 通過編寫程序&#xff0c;模擬瀏覽器上網&#xff0c;讓其去互聯網上抓取數據的過程。 ① 通用爬蟲&#xff1a;抓取系統重要的組成部分&#xff0c;抓取的是一整張頁面的數據 ② 聚焦爬蟲&#xff1a;建立在通用爬蟲的基礎之上&am…

經營你的iOS應用日志(二):異常日志

如果你去4S店修車&#xff0c;給小工說你的車哪天怎么樣怎么樣了&#xff0c;小工有可能會立即搬出一臺電腦&#xff0c;插上行車電腦把日志打出來&#xff0c;然后告訴你你的車發生過什么故障。汽車尚且如此&#xff0c;何況移動互聯網應用呢。 本文第一篇&#xff1a;經營你的…