-1
私はPow(x、n)(https://leetcode.com/problems/powx-n/)というLeetCode質問No.50に取り組んでいます。 xのn乗を返すように私に頼んだ。以下は私の最初の分裂と征服の解決です。リートコードパズルPow(x、n)の次の2つの解の違いは何ですか?
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)));
}
}
サブ結果の値を代入すると、時間制限超過の問題を解決できるのはなぜ?違いは何ですか?
メソッドの結果はキャッシュされないので、もちろん値を格納することが望ましい –