首页 > 试题广场 >

跳跃游戏(二)

[编程题]跳跃游戏(二)
  • 热度指数:4758 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度,如果可以跳到数组最后一个位置,请你求出跳跃路径中所能获得的最多的积分。
1.如果能够跳到数组最后一个位置,才能计算所获得的积分,否则积分值为-1
2.如果无法跳跃(即数组长度为0),也请返回-1
3.数据保证返回的结果不会超过整形范围,即不会超过
数据范围:




输入描述:
第一行输入一个正整数 n 表示数组 nums的长度
第二行输入 n 个整数,表示数组 nums 的所有元素的值


输出描述:
输出能获得的最多的积分
示例1

输入

6
2 4 2 1 0 100

输出

106

说明

首先位于nums[0]=2,然后可以跳1步,到nums[1]=4的位置,积分=2+4=6,再跳到nums[5]=100的位置,积分=6+100=106
这样保证既能跳到数组最后一个元素,又能保证获取的积分最多    
示例2

输入

6
2 4 0 2 0 100

输出

108

说明

跳跃路径为:2=>4=>2=>100,总共为108        
示例3

输入

6
2 3 2 1 0 100

输出

-1

说明

跳不到最后一个位置,返回-1       
package main

import (
    "fmt"
)

func main() {

    for {
        var n int 
        _, err := fmt.Scan(&n)
        if err != nil {
            break
        }
        nums := make([]int, n)
        for i := range nums {
            fmt.Scan(&nums[i])
        }
        fmt.Println(solve(nums))
    }
}

func solve(nums []int) int {
    n := len(nums)
    if n == 0 {
        return 0
    }
    canReachs := make([]bool, n)
    canReachs[n-1] = true
    r := n-1
    for i := n-2; i >= 0; i-- {
        if i+nums[i] >= r {
            r = i
            canReachs[i] = true
        }
    }
    if r > 0 {
        return -1 // 不可达
    }

    score := 0
    for i := 0; i < n;  {
        if canReachs[i] {
            score += nums[i]
        }
        k := 1
        for k := 1; k <= nums[i] && i+k<n && !canReachs[i+k]; k++ {}
        i += k
    }
    return score
}

发表于 2024-07-09 15:10:34 回复(0)

问题信息

难度:
1条回答 2041浏览

热门推荐

通过挑战的用户

查看代码
跳跃游戏(二)