LeetCode55 跳躍遊戲
【題目】
給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個位置。
【樣例】
輸入: [2,3,1,1,4]
輸出: true
解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後一個位置。
【思考】
使用動規,dp[x]代表從頭到x是否可以達到
【代碼】
public boolean canJump(int[] nums) {
if (nums==null || nums.length==0) return false;
int i,j,len;
len = nums.length;
boolean[] dp = new boolean[len];
dp[0] = true;
for (i=1; i<len; i++) {
if (dp[i-1] && nums[i-1]>0) {
dp[i] = true;
} else {
for (j=0; j<i; j++) {
if (dp[j] && nums[j]>=(i-j)) {
dp[i] = true;
break;
}
}
}
}
return dp[len-1];
}
LeetCode45 跳躍遊戲 ||
【題目】
給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。
【樣例】
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。
【思考】
使用dp會超時
考慮使用貪心:每次計算一步能夠跳躍的範圍,每一次都以一個範圍作爲一步來計算
/**
* 這種方式的dp會超時
* */
public int jump1(int[] nums) {
if (nums==null || nums.length==0) return 0;
int i,j,len,l;
len = nums.length;
int[] dp = new int[len];
dp[0] = 0;
for (i=1; i<len; i++) {
l = Integer.MAX_VALUE;
for (j=0; j<i; j++) {
if (nums[j]>=(i-j) && l>dp[j]) {
l = dp[j];
}
}
dp[i] = l+1;
}
return dp[len-1];
}
/**
* 使用貪心算法,每次計算一步能夠跳躍的範圍
* 每一次都以一個範圍作爲一步來計算
* */
public int jump(int[] nums) {
if (nums==null || nums.length==0) return 0;
int left,right,max,i,step;
left = 0;
right = 1;
step = 0;
while (right<nums.length) {
max = 0;
for (i=left; i<right; i++) {
if (max < nums[i]+i) max = nums[i]+i;
}
left = right;
right = max+1;
step ++;
}
return step;
}
【Java 面試那點事】
這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!
這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】
面試路上,你不孤單!