LeetCode | 45. Jump Game IIDP或贪心难题

Given an array of non-negative integers, you are initiallypositioned at the first index of the array.

Each element in the array represents your maximum jump length atthat position.

Your goal is to reach the last index in the minimum number ofjumps.

For example:
Given array A = 
[2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1,then 3 steps to the last index.)

Note:
You can assume that you can always reach the last index.

这一题估计很多人第一次遇到都会马上想到dp,dp[i]=min{dp[j]+1},j=0~i-1,但是这样的话计算时间复杂度为O(n^2),这种解决方法不应该是hard题应该有的难度,一提交果然超时了

  后来我又想了一会,是否有更快的方法能够解决这一题,果然被我想到了,这一题使用贪心算法的话可以在O(n)的时间内得到结果,使用theLine数组来记录到达某个地点需要的最小步数,每个数最多循环一次,其在theLine数组里面的值最多修改一次,总时间为O(n)

class Solution {
public:
   
int jump(vector<int>& nums) {
	int n = nums.size();
    if(n==1) return 0;
	vector<int> theLine(n, 0);
	int left, right, l;
	left = 0; right = 0;
	while (left <= right)
	{
		l = nums[left] + left;
		if (l >= n-1) return theLine[left] + 1;
		if (nums[left] + left > right)
		{
			for (int i = nums[left] + left; i > right; i--)
			{
				theLine[i] = theLine[left] + 1;
			}
			right = l;
		}
		left++;
	}
	return 1;
}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值