笔试题58. LeetCode OJ (45)

Posted _从未止步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题58. LeetCode OJ (45)相关的知识,希望对你有一定的参考价值。

         这个题目是一个特殊的跳台阶问题,给定一个数组,每个数组里面存放的是该位置可以跳的步数,求出跳到最后位置所需要的最少的步数。我看到这个题目的时候脑子里面的第一印象是递归,递归去求解肯定是可以的,于是我写了下面的代码(结果是超时!)

解法一,递归查找,时间效率太低了。。。不行
class Solution {
public:
	int jump(vector<int>& nums)
	{
		/*
			数组里面的内容代表给位置所能跳的最大步数,找出跳到最后位置所需要的最少步数
		*/

		
		
		int len = nums.size();
		//vector<int> Spos;
		int first = nums[0];
		int mintimes = 0;
		for (int i = 1; i <= first; ++i)
		{
			//int length = findAllsolv(nums, Spos, i);
			int times = findAllsolv(nums, i);
			if (i == 1)
			{
				mintimes = times;
			}
			else
			{
				if (mintimes > times)
				{
					mintimes = times;
				}
			}
		}
		
		return mintimes;
	}

	int findAllsolv(vector<int>& nums, int begin)
	{
		int times = 0;
		if (begin >= nums.size())
		{
			return 0;
		}

		for (int i = 1; i <= nums[begin]; ++i)
		{
			int time =  1 + findAllsolv(nums, begin + i);
			if (i == 1)
			{
				times = time;
			}
			else
			{
				if (times > time)
				{
					times = time;
				}
			}
		}

		return times;
	}
};

我发现了问题!递归求解的时候包括了每次跳一步的情况,这样的跳法肯定不是最优解,于是在我反思递归做法的时候我想到了一个比较好的方法,属于贪心算法。


这种方法确实可行,不过实现的时候千万要记得越界的处理,稍不注意就可能错误,下面是我的代码:

class Solution {
public:
	int jump(vector<int>& nums)
	{
		/*这类问题还是使用贪心算法*/
		int pos = 0;
		int length = nums.size();
		int index = 0;

		if (length == 0)
		{
			return 0;
		}

		while (index < length-1)
		{
			int next = 0;
			int begin = index;
			int onejump = 0;
			for (int i = 1; i <= nums[index]; ++i)
			{
				if (nums[index] >= length-1 || index + i >= length || index + nums[index + i] >= length)
				{// [1,3,2]  // [1,2]  // [2,3,1]  //9, 6, 6, 2, 3, 1, 0, 9, 2, 7
					
					if (index + nums[index] < length - 1)
					{
						++pos;
					}
					next = length;
					break;
				}

				if (i + nums[index+i] > onejump)
				{
					next = i;
					onejump = i + nums[index + i];
				}

			}
			++pos;
			index += next;
		}

		return pos;
	}
};
结果如下:



以上是关于笔试题58. LeetCode OJ (45)的主要内容,如果未能解决你的问题,请参考以下文章

笔试题57. LeetCode OJ (44)

笔试题61. LeetCode OJ (48)

笔试题55. LeetCode OJ (42)

笔试题65. LeetCode OJ (52)

笔试题54. LeetCode OJ (41)

笔试题63. LeetCode OJ (50)