2016-06-28 1 views
-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))); 


} 
} 

サブ結果の値を代入すると、時間制限超過の問題を解決できるのはなぜ?違いは何ですか?

+1

メソッドの結果はキャッシュされないので、もちろん値を格納することが望ましい –

答えて

0

JVMは2つのmyPow(x、n/2)がまったく同じことをするので、2回計算します。これをローカル変数に代入するとこのペナルティが削除されるため、実行時間は約の半分になります。それ以上のタイムアウトはありません。

関連する問題