首先理解題意:有n個小球從[0]到[n-1]排序,然後每個小球都可以跳躍到當前位置記錄的值上,同時可以任意的跳躍到左邊,當然0的時候只能向右跳躍。例如:
jump = [2, 5, 1, 1, 1, 1] ,當小球在0的位置上時,只能夠向右跳2位即達到jump[2]上當到達a[2]的時候就可以左右橫跳了,當然只能向右一位。
這個時候我們可以建立四個條件
第乙個是:
int rightidx = jump[curidx]+curidx;
第二個是
當curidx >0 ,存在leftidx
for
(int i =
0;i)
第三個退出條件
if
(jump[curidx]
+curidx >= jump.length)
第四個條件,跳躍次數
int count =0;
//當向左向右跳的時候需要count++
因為當跳到右邊的時候,左邊可以任意跳,當左邊已經訪問過的時候可以不需要再訪問左邊因此我們用乙個陣列visted是否為0表示是否已經訪問過,然後用乙個佇列儲存已經訪問過的節點,然後用貪心演算法遍歷。
public
intminjump
(int
jump));
visted[0]
=1;//當佇列有值的時候進行遍歷
while
(!q.
isempty()
)else);
//增加訪問標識
visted[rightidx ]=1
;}}//向左跳躍
for(
int i =
0;i;i++))
;//增加訪問標識
visted[i]=1
;}}}
return-1
;}
然後進行提交,超時白給。。。。主要的原因是因為當我們向左跳躍時,每次都是從0到cur-1的遍歷,當cur的值越來越大的時候耗時會越來越多,此時是否可以考慮減少從左到cur-1的遍歷次數,對於cur-1左邊已經遍歷過的值,我們再向左跳一次,然後再從左邊那個值向右跳躍肯定不是最優解,所以我們需要引進maxleft來儲存左邊訪問的最大的值,在每個節點遍歷完的時候將cur賦值給maxleft
修改後的**
public
intminjump
(int
jump));
visted[0]
=1;int leftmax =0;
//當佇列有值的時候進行遍歷
while
(!q.
isempty()
)else);
//增加訪問標識
visted[rightidx ]=1
;}}//向左跳躍
for(
int i = leftmax+
1;i;i++))
;//增加訪問標識
visted[i]=1
;}} leftmax = cur[0]
;}return-1
;}
同時也可以採取動態規劃,從後往前計算最小步數
public
intminjump
(int
jump)
}return dp[0]
;}
ps:題解都是源自於leetcode各位大佬的解答,我這種渣渣只要題夠難,我就敢白給,希望下次再做的時候還能知道解法。 LeetCodeLCP 14 切分陣列
給定乙個整數陣列 nums 小李想將 nums 切割成若干個非空子陣列,使得每個子陣列最左邊的數和最右邊的數的最大公約數大於 1 為了減少他的工作量,請求出最少可以切成多少個子陣列。示例 1 輸入 nums 2,3,3,2,3,3 輸出 2 解釋 最優切割為 2,3,3,2 和 3,3 第乙個子陣列...
LeetCode LCP 01 傳遞資訊
問題描述 小朋友 a 在和 ta 的小夥伴們玩傳資訊遊戲,遊戲規則如下 有 n 名玩家,所有玩家編號分別為 0 n 1,其中小朋友 a 的編號為 0 每個玩家都有固定的若干個可傳資訊的其他玩家 也可能沒有 傳資訊的關係是單向的 比如 a 可以向 b 傳資訊,但 b 不能向 a 傳資訊 每輪資訊必須需...
leetcode LCP 11 期望個數統計
某網際網路公司一年一度的春招開始了,一共有 n 名面試者入選。每名面試者都會提交乙份簡歷,公司會根據提供的簡歷資料產生乙個預估的能力值,數值越大代表越有可能通過面試。小 a 和小 b 負責審核面試者,他們均有所有面試者的簡歷,並且將各自根據面試者能力值從大到小的順序瀏覽。由於簡歷事先被打亂過,能力值...