研究下面找到最小跳跃数的算法难题。发布详细的问题陈述和两个代码版本来解决此问题。我已经进行了测试,似乎两个版本都有效,而我的第二个版本是版本一个代码的优化版本,这使得我从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;
}
};
提前谢谢,
林
答案 0 :(得分:1)
最好的方法是测试它。人类不能总是考虑特殊情况,但自动化测试可以涵盖大多数特殊情况。如果您认为第一个版本运行良好,则可以将第一个版本的结果与第二个版本的结果进行比较。这是一个例子:
map.fitBounds(bounds);