这题还是一道贪心。(最近LC很喜欢出贪心啊)
因为nums[i]表示在第i个位置时每一步能向前走0~nums[i]的长度,所以若每一步都走的尽量远,最后到达终点时消耗的步数一定最短。(如果这题改成在i位置时只能走nums[i]长度那就变成一道dp了)
所以对于每一步,我们都去选择能够到的最远位置。
在具体实现的时候选择一个循环从左向右遍历。维护一个maxpos值表示当前这个位置能走到的最远位置,并把它更新为边界。当走到边界的时候step++表示走了一步,然后继续更新边界。
值得一提的是,遍历过程仅访问0~n-1个元素,因为在跳到最后一个位置前,border值肯定是大于等于n的,不然就不符合题中“ 总是可以到达数组的最后一个位置”的设定了。如果border==n,step会多加一次。
class Solution { public: int jump(vector<int>& nums) { int maxpos = 0, border = 0, step = 0; int n = nums.size(); for (int i = 0; i < n - 1; i++) { if (maxpos >= i)//还没走到边界 { //去更新能走到的最大位置 maxpos = max(maxpos, i + nums[i]); //走到了,更新边界 if (i == border) { border = maxpos; step++; } } } return step; } };
感觉这题不配hard。改成dp好像还要更难做一点的样子…
评论
还没有任何评论,你来说两句吧!