列表

详情


DP26. 跳跃游戏(一)

描述

给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。如果能够跳到数组最后一个位置,则输出true,否则输出false。
数据范围:

输入描述

第一行输入一个正整数 n ,表示数组 nums 的长度
第二行输入 n 个整数表示数组的每个元素

输出描述

输出 true 或者 false

示例1

输入:

7
2 1 3 3 0 0 100

输出:

true

说明:

首先位于nums[0]=2,然后可以跳2步,到nums[2]=3的位置,再跳到nums[3]=3的位置,再直接跳到nums[6]=100,可以跳到最后,输出true  

示例2

输入:

7
2 1 3 2 0 0 100

输出:

false

说明:

无论怎么样,都跳不到nums[6]=100的位置  

原站题解

Rust 解法, 执行用时: 12ms, 内存消耗: 3336KB, 提交时间: 2022-07-05

use std::io;


fn main() {
    let st = io::stdin();
    let mut n = String::new();
    st.read_line(&mut n).expect("Failure");
    let n:usize = n.trim().parse().expect("Failure");
    let mut nums = String::new();
    st.read_line(&mut nums).unwrap();
    let nums = nums.trim()
                .split_whitespace()
                .map(|s| s.parse::<usize>().unwrap())
                .collect::<Vec<usize>>();
    
    let mut farthest = 0usize;
    
    for i in (0..n-1) {
        farthest = farthest.max(i + nums[i]);
        if farthest <= i {
            println!("{}", false);
            return;
        }
    }
    
    
    println!("{}", farthest >= n-1);
}

C++ 解法, 执行用时: 20ms, 内存消耗: 1164KB, 提交时间: 2022-05-07

#include <cstdlib>
#include <algorithm>
#include <cstdio>
using namespace std;

int main() {
	int n;
	scanf("%d", &n);
	int num[200005];
	int maxLen = 0;
	for (int i = 0; i < n; ++i) {
		scanf("%d", &num[i]);
        if(i>maxLen) break;
		maxLen = max(maxLen, i + num[i]);
		if (maxLen >= n - 1) {
			printf("true\n");
			return 0;
		}
	}
	printf("false\n");
	return 0;
}

C++ 解法, 执行用时: 21ms, 内存消耗: 2508KB, 提交时间: 2022-03-24

#include"iostream"
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    int n,a[200005],reach = 0;
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<=reach&&reach<n-1;i++)
    {
        reach = max(reach,i + a[i]);
    }
    if(reach>=n-1) cout<<"true";
    else cout<<"false";
    return 0;
}

C 解法, 执行用时: 25ms, 内存消耗: 1136KB, 提交时间: 2022-02-16

#include <stdio.h>

int max(int a,int b)
{
    return a>b?a:b;
}

int main() {
   
    long long n,i,j,t,maxi=0;
    int q = 1;
    int arr[200002] = {0};
    int dp[200002] = {0};
    
    scanf("%d",&n);
    
   for( i= 0; i < n;i++)
   {
       scanf("%d",&arr[i]);
   }
    
    
    for(i = 0;i<n;i++)
    {
       if(i > maxi)
       {
           q = 0;
           printf("false");
           break;
       }
        maxi = max(maxi,i+arr[i]);
        if(maxi >= n-1)
        {
            q = 1;
        }
    }
    
   if(q)
   {
       printf("true");
   }
    
   return 0;
}

C++ 解法, 执行用时: 25ms, 内存消耗: 1252KB, 提交时间: 2022-03-15

#include<bits/stdc++.h>
using namespace std;
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n;
    cin>>n;
    vector<int>arr(n,0);
    for (int i = 0; i < n;++i){
        cin>>arr[i];
    }
    int len = arr[0];
    for (int i = 1; i < n; ++i){
        len = ((len >= i) ? max(arr[i] + i,len) : len);
    }
    cout << ((len >= n - 1) ? "true" : "false");
    return 0;
}

上一题