Error抱歉,在这种情况下为什么我的输出错误?正确答案是2的可能性如何? https://leetcode.com/problems/jump-game-ii/ 我正在尝试解决第二跳问题。在代码块上,结果正确,在Leetcode号上。我发现该站点将静态变量min初始化为0,而不是我写的值100。奇怪的是,在其他情况下,网站会正确地对其进行初始化。这是代码。
int jump(int* nums, int numsSize){
static int i=0;
static int shots=0;
static int min=100;
if (i == numsSize - 1){
if (shots < min){
min = shots;
}
return min;
}
else if(nums[0] >= (numsSize-i)){
i++;
shots++;
min=jump(&(nums[1]), numsSize); //single jump in one shot
i--;
shots--;
return min;
}
else{
if(nums[0] != 0){
i += nums[0];
shots++;
min = jump(&(nums[nums[0]]), numsSize);//multiple jump in one shot
shots--;
i -= nums[0];
}
i++;
shots++;
min=jump(&(nums[1]), numsSize); //single jump in one shot
i--;
shots--;
return min;
}
}
答案 0 :(得分:2)
min
变量被标记为static
。这意味着它将在jump
的调用之间保留其值。我认为您正在使用它,是因为您想在对jump
的递归调用中对其进行修改,但是副作用是它还在测试用例中保留。
正在发生的事情是代码块,每个测试用例正在单独运行(在程序的单独运行中)。因此,每次min
被静态初始化为100。在Leetcode上,测试用例在一个循环中一个接一个地运行。这意味着,如果一个测试运行返回0,则min
不会重新初始化回100,以进行后续测试运行。当然,我不确定这一点,但是似乎很有可能,static
的这种误用绝对是代码中的错误,如果两次使用该函数,则会导致错误。
您可能对i
和shots
遇到同样的问题。
如果您确实需要递归树下的状态,最好将其显式传递下来。如果您也需要更新它(在此处进行操作),请使用指针参数。
也许是这样的:
typedef struct jump_state_s {
int min;
int i;
int shots;
} jump_state_s;
int jump1(int* nums, int numsSize, jump_state_s *js) {
if (js->i == numsSize - 1){
if (js->shots < js->min){
js->min = js->shots;
}
return js->min;
}
... rest of code
}
int jump(int *nums, int numsSize) {
jump_state_s js = {100, 0, 0};
return jump1(nums, numsSize, &js);
}
请注意,这不是为此问题编程解决方案的最佳方法,并且在最坏的情况下将导致指数时间。最佳解决方案看起来像一个迭代的动态编程解决方案,对每个平方使用一组“最佳”值。