英文:
Logical difference between the two approaches. (Count ways to reach the n'th stair)
问题
以下是翻译好的部分:
//---01--------
int mod = (int)1e9+7;
int prev1 = 1;
int prev2 = 1;
for(int i = 2; i <= n; i++){
prev2 = (prev2 + prev1) % mod;
prev1 = prev2 - prev1;
}
return prev2;
//---02--------
int mod = (int)1e9+7;
int prev1 = 1;
int prev2 = 1;
for(int i = 2; i <= n; i++){
int curr = (prev2 + prev1) % mod;
prev1 = prev2;
prev2 = curr;
}
return prev2;
英文:
I am trying to count the number of ways to reach the nth stair, starting from the first stair and going up either one or two stairs at a time. The first approach below works fine, but the second does not.
//---01--------
int mod = (int)1e9+7;
int prev1 = 1;
int prev2 = 1;
for(int i = 2; i <= n; i++){
prev2 = (prev2 + prev1) % mod;
prev1 = prev2 - prev1;
}
return prev2;
//---02--------
int mod = (int)1e9+7;
int prev1 = 1;
int prev2 = 1;
for(int i = 2; i <= n; i++){
int curr = (prev2 + prev1) % mod;
prev1 = prev2;
prev2 = curr;
}
return prev2;
The second approach doesn't work with large n.
Sample Input Case: n = 87
Output with the second approach:
-334512466
Expected Output:
665487541
答案1
得分: 0
第一个解决方案存在问题,与第二个解决方案相反。第一个解决方案将溢出(不是整数溢出,而是由于错误逻辑导致负值),而第二个解决方案不会。
为了更好地理解,请查看下面对第一个解决方案的更新代码 -
for (int i = 2; i <= n; i++) {
System.out.println("i : " + i);
prev2 = (prev2 + prev1) % mod;
System.out.println("P2 : " + prev2);
System.out.println("P1 : " + prev1);
prev1 = prev2 - prev1;
}
以下是上述代码的输出 -
i : 44
P2 : 134903163
P1 : 433494437
i : 45
P2 : -163688111
P1 : -298591274
如果观察这些值,您会发现对于 i=44,由于 mod 函数,prev2 小于 prev1,当您执行 prev1 = prev2 - prev1;
时,会得到负值,因此这个解决方案是错误的。
而第二个解决方案将正常工作,因为没有这种情况。
英文:
Its other way around, your first solution will overflow(not Integer overflow but negative values due to wrong logic) but not second one.
For better understanding see below updated code for your first solution -
for(int i = 2; i <= n; i++){
System.out.println("i : "+i);
prev2 = (prev2 + prev1) % mod;
System.out.println("P2 : " +prev2);
System.out.println("P1 : " +prev1);
prev1 = prev2 - prev1;
}
Below is the output of above -
i : 44
P2 : 134903163
P1 : 433494437
i : 45
P2 : -163688111
P1 : -298591274
If you observe the values you can see, for i=44, prev2 is smaller then prev1 because of mod function and when you will do prev1 = prev2 - prev1;
you will get negative value so this solution is wrong.
While second solution will work as there is no such case.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论