跳躍遊戲
阿新 • • 發佈:2018-05-18
system 更新 else 代碼 toe 輸出格式 最優 心算 pub
問題描述
給定一個非負整數數組,假定你的初始位置為數組第一個下標。
數組中的每個元素代表你在那個位置能夠跳躍的最大長度。
請確認你是否能夠跳躍到數組的最後一個下標。
例如:
A=[2,3,1,1,4] 能夠跳躍到最後一個下標,輸出true
;
A=[3,2,1,0,4] 不能跳躍到最後一個下標,輸出false
。
輸入格式
第一行輸入一個正整數 n (1 ≤ n ≤ 500),接下來的一行 n 個整數,輸入數組 A[n]。
輸出格式
如果能跳到最後一個下標,輸出true
,否則輸出false
。
代碼
參考代碼一
package javaexam; import java.util.Scanner; public
class IsJumpToEnd { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int farthest = 0; int[] A = new int[n]; for(int i = 0; i < n; ++i) { A[i] = input.nextInt(); if(farthest < i) { System.out.print(false); break; } farthest = Math.max(farthest, A[i] + i); if(farthest >= n - 1) { System.out.print(true); break; } } } }
參考代碼二
import java.util.*;
public class Main {
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
/*
思路:貪心算法;
從第一個開始,尋找一個可以跳最遠的點;
例如:a[7]={3,1,2,4,1,0,0}
0 1 2 3 4 5 6
1.從第一個位置0,可以跳到位置1、2、3;
2.如果跳到位置1,那麽最遠可跳到(1+a[1]);
3.如果跳到位置2,那麽最遠可跳到(2+a[2]);
4.如果跳到位置3,那麽最遠可跳到(3+a[3]);
5.故選擇跳到位置3,重復上述步驟;
算法分析:
1.如果選擇跳到位置3,就無法選擇跳到位置1和位置2,那麽會不會錯過最優解呢?不會!
2.因為位置1、2能到達的位置,位置3都可達;
3.故不會錯過最優解。
*/
int[] a = new int[n];
for(int i = 0; i < n; ++i)
{
a[i] = input.nextInt();
}
int i;
int r; //控制搜索終止位置
int l; //控制搜索開始位置
for(i = 0; i < n && a[i] != 0;) //當a[i]=0時,該位置為可到達的最遠位置
{
r = i + a[i];
l = i + 1;
for(int j = i + 1; j < n && j <= i+a[i]; ++j)
{
if(j+a[j] >= r) //遍歷能到達的最遠位置
{
r = j + a[j]; //更新左右邊界
l = j;
}
}
i = l; //左邊界
}
if(i < n - 1)
{
System.out.println("false");
}
else
{
System.out.println("true");
}
}
}
樣例測試
樣例一:
5
2 3 1 1 4
true
樣例二:
5
3 2 1 0 4
false
跳躍遊戲