上題目:
解空間明確,乙個從 nums[0] 開始輻射出去的樹狀解空間。首先暴力搜尋一下,暴力搜尋解法:
public解的過程中我們發現,回歸過程是自底向上的,在回歸的過程中,有大量的節點出現了重複計算,可考慮快取避免重複計算。快取搜尋:final
boolean canjump(int
nums)
int length=nums.length;
return jump(nums,length,0);
}public
final
boolean jump(int nums,int length,int
current)
if(current>length-1)
boolean re=false
;
int currentsteps=nums[current];
for(int i=1;i<=currentsteps;i++)
return
re; }
public快取計算定義好後,考慮避免遞迴帶來的棧幀釋放建立的開銷,逆推快取優化為動態規劃解法:final
boolean canjump(int
nums)
int length=nums.length;
int cache=new
int[length];
return jump(nums,length,0,cache);
}public
final
boolean jump(int nums,int length,int current,int
cache)
if(current>length-1||cache[current]==-1)
boolean re=false
;
int currentsteps=nums[current];
for(int i=1;i<=currentsteps;i++)
}cache[current]=re?1:-1;
return
re; }
public動態規劃的過程中牽扯到兩層 for 迴圈,內層的 for 迴圈可以使用貪心演算法優化,以區域性最優解獲得全域性最優解,我們只需要找到互動範圍內最近的可到達終點的 goodnode 就可以了。貪心演算法:final
boolean dpjump1(int
nums)
int length =nums.length;
int cache = new
int[length];
int goodnode = 0;
for (int i = length - 1; i >= 0; i--)
for (int j = i + currentstep; j >= i; j--)
}printnums(cache);
}return cache[0] == 1 ? true : false
; }
//貪心public
final
boolean dpjump(int
nums)
int length =nums.length;
int cache = new
int[length];
int goodnode = 0;
for (int i = length - 1; i >= 0; i--)
if (goodnode != 0 && (i + currentstep) >=goodnode)
printnums(cache);
}return cache[0] == 1 ? true : false
; }
LeetCode 跳躍遊戲 55
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fa...
LeetCode55 跳躍遊戲
leetcode55.跳躍遊戲 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入...
LeetCode 55 跳躍遊戲
題目鏈結 題目描述 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。輸入 3,2,1,0,4 輸出 ...