leetcode45 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000
  • 题目保证可以到达 nums[n-1]

Go实现:

func jump(nums []int) int {

	// 获取nums长度
	n := len(nums)

	// 如果nums长度为1(题意限制nums长度至少为1),则当前元素即为最后一个元素,无需进行跳跃
	if n == 1 {
		return 0
	}

	// 定义跳跃数,因为前面已排除单元素无需跳跃的情况,故初始值为1,表示至少需要跳跃一次
	jumps := 1
	// 定义最远可以到达的位置,初始值为0
	farthest := 0
	// 定义当前跳跃范围的末尾,初始值为0
	current_jump_end := 0

	// 因为提示一定存在解,即表示 nums[n-1] 肯定在最后一跳范围内,故遍历范围可以排除 nums[n-1],提升遍历效率
	for i := 0; i < n-1; i++ {

		// 在当前跳跃范围内,动态获取当前节点和最远位置中较大值
		farthest = max(farthest, i+nums[i])

		// 如果最远位置范围超过末尾元素,则停止遍历
		if farthest >= n-1 {
			break
		}

		// 如果最远位置还未达到nums末尾,且已经遍历到当前跳跃范围的末尾,则将最新的最远位置,更新为当前跳跃范围末尾,同时跳跃数加1,表示还需继续跳跃
		if i == current_jump_end {
			current_jump_end = farthest
			jumps++
		}

	}

	// 返回最终计算结果
	return jumps
}

// 辅助函数,求两数中较大值
func max(a, b int) int {
	if a >= b {
		return a
	}
	return b
}
posted @   505donkey  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示