gpt4 book ai didi

c++ - 找到最小跳跃次数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:39 27 4
gpt4 key购买 nike

正在研究以下寻找最小跳跃次数的算法难题。发布了详细的问题陈述和两个代码版本来解决此问题。我已经测试过,两个版本似乎都可以,我的第二个版本是第一个版本代码的优化版本,这使得我从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;
}
};

提前致谢,林

最佳答案

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

/*
* arraySize : array size to use for the test
* min : min jump in the array
* max : max jump in the array
*/
void testJumps(int arraySize, int min, int max){

static int counter = 0;
std::cout << "-----------Test " << counter << "------------" << std::endl;
std::cout << "Array size : " << arraySize << " Minimum Jump : " << min << " Max Jump" << max << std::endl;
//Create vector with random numbers
std::vector<int> vecNumbers(arraySize, 0);
for(unsigned int i = 0; i < vecNumbers.size(); i++)
vecNumbers[i] = rand() % max + min;

//Value of first function
int iVersion1 = jump1(vecNumbers);

//Second fucntion
int iVersion2 = jump2(vecNumbers);

assert(iVersion1 == iVersion2);

std::cout << "Test " << counter << " succeeded" << std::endl;
std::cout << "-----------------------" << std::endl;

counter++;

}

int main()
{
//Two test
testJumps(10, 1, 100);
testJumps(20, 10, 200);

//You can even make a loop of test
//...
}

关于c++ - 找到最小跳跃次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33928965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com