找到最小跳跃次数

时间:2015-11-26 00:54:15

标签: c++ algorithm

研究下面找到最小跳跃数的算法难题。发布详细的问题陈述和两个代码版本来解决此问题。我已经进行了测试,似乎两个版本都有效,而我的第二个版本是版本一个代码的优化版本,这使得我从i=maxIndex开始,而不是连续增加,这可以通过不迭代所有插槽来节省时间数组。

我的问题是,想知道我的第二版代码是否100%正确?如果有人发现任何逻辑问题,请指出。

问题陈述

给定一个非负整数数组,您最初位于数组的第一个索引处。

数组中的每个元素代表该位置的最大跳跃长度。

您的目标是以最小跳跃次数到达最后一个索引。

例如: 给定数组A = [2,3,1,1,4]

到达最后一个索引的最小跳转次数为2.(从索引0跳转1步到1,然后从最后一个索引跳3步。)

首个版本代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int i = 0, n = nums.size(), step = 0, end = 0, maxend = 0;
        while (end < n - 1) {
            step++;
            for (;i <= end; i++) {
                maxend = max(maxend, i + nums[i]);
                if (maxend >= n - 1) return step;
            }
            if(end == maxend) break;
            end = maxend;
        }
        return n == 1 ? 0 : -1;
    }
};

第二版代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int i = 0, n = nums.size(), step = 0, end = 0, maxend = 0;
        int maxIndex = 0;
        while (end < n - 1) {
            step++;
            for (i=maxIndex;i <= end; i++) {
                if ((i + nums[i]) > maxend)
                {
                  maxend = i + nums[i];
                  maxIndex = i;
                }

                if (maxend >= n - 1) return step;
            }
            if(end == maxend) break;
            end = maxend;
        }
        return n == 1 ? 0 : -1;
    }
};
提前谢谢, 林

1 个答案:

答案 0 :(得分:1)

最好的方法是测试它。人类不能总是考虑特殊情况,但自动化测试可以涵盖大多数特殊情况。如果您认为第一个版本运行良好,则可以将第一个版本的结果与第二个版本的结果进行比较。这是一个例子:

map.fitBounds(bounds);