Я работаю над вопросом №50 LeetCode с именем Pow (x, n) (https://leetcode.com/problems/powx-n/). Он попросил меня вернуть n силу x. Ниже мое первоначальное решение о разделении и победе.В чем разница между следующими двумя решениями голосовой строки leetcode Pow (x, n)
public class Solution {
public double myPow(double x, int n) {
if(n == 1) {return x;}
if(n == 0) {return 1;}
if(x == 0) {return 0;}
if(x == 1) {return 1;}
if(n>0)
{
if(n%2 == 1)
{
return (myPow(x,n/2)*myPow(x,n/2)*x);
}
else
{
return (myPow(x,n/2)*myPow(x,n/2));
}
}
else if((n<0)&&(n>Integer.MIN_VALUE))
{
return (1/myPow(x,-n));
}
else return (1/(x*myPow(x,-n-1)));
}
}
Проблема в том, что при очень большом n это решение имеет проблему с превышением лимита времени. Однако, если изменить код к следующему, время Превышен предел проблема решена:
public class Solution {
public double myPow(double x, int n) {
if(n == 1) {return x;}
if(n == 0) {return 1;}
if(x == 0) {return 0;}
if(x == 1) {return 1;}
if(n>0)
{
if(n%2 == 1)
{
double sub = myPow(x,n/2);
return sub*sub*x;
}
else
{
double sub = myPow(x,n/2);
return sub*sub; }
}
else if((n<0)&&(n>Integer.MIN_VALUE))
{
return (1/myPow(x,-n));
}
else return (1/(x*myPow(x,-n-1)));
}
}
Почему присвоения значения суб-результата может решить Лимит времени Превышен проблема? В чем разница?
Результаты метода не кэшируются, поэтому, конечно, сохранение значения является предпочтительным –