跳跃游戏

该博客讨论了一种跳跃游戏的优化解法,其中玩家每次可以从当前位置跳1到k个单位距离。文章提供了一个具体的例子,如arr = [3,2,3,1,1,4],并解释了如何在两步内到达数组末尾。博客重点在于提出一个满足O(N)时间复杂度和O(1)额外空间复杂度要求的算法策略。" 129701391,5111523,CMake编译类型详解:Debug、Release、MinSizeRel与RelWithDebInfo,"['C++', 'Linux', 'CMake', '开发工具']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】给定数组arr,arr[i] == k代表可以从位置i向右跳1~k个距离。比如arr[2] ==3,代表从位置2可以跳到位置3、位置4、位置5.如果从位置0出发,返回最少跳几次能跳到arr最后的位置上。

【举例】arr = [3,2,3,1,1,4].

arr[0] == 3, 选择跳到位置2,arr[2] == 3,可以跳到最后的位置,所以返回2.

【要求】如果arr长度为N,要求实现时间复杂度为O(N)、额外空间复杂度为O(1)的方法。

public class Jump {
	public static int jump(int[] arr) {
		if (arr.length == 0 || arr == null) {
			return 0;
		}
		int jump = 0; // 代表目前跳了多少步
		int cur = 0; // 代表代表如果只跳jump步,最远能到的位置
		int next = 0;// 代表如果多跳一步,最远能到的位置
		/*
		 * 从左到右遍历arr,假设遍历到位置i 
		 * 1.如果cur >= i,说明跳jump步可以到达i,什么也不做。 
		 * 2.如果cur < i,说明只跳jump步到不了i,需要多跳一步才行,此时令jump++,
		 * cur = next,表示多跳了一步,cur更新成跳jump+1步能够到达的位置,即next。
		 * 3.将next更新成math.max(next,i+arr[i]),表示下一次多跳一步到达的最远位置。
		 */
		for (int i = 0; i < arr.length; i++) {
			if (cur < i) {
				jump++;
				cur = next;
			}
			next = Math.max(next, i + arr[i]);
		}
		return jump;

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值