数は、2つの数の力であるかどうかをチェック機能の時間複雑

Ashvin氏シャルマ:

数(N)は次のように表すことができる場合、私は、チェックに対する解決策を書きました

EQ

A> 0かつP> 1私は、このソリューションの複雑さはO(だと思う場合複雑

しかし、私はちょうど私が私の結論に来て助けたループの動作を理解し、私は、ログのベースについてはわからないと私は数学的な説明はありません。

public int isPower(int A) {
    for (int i = 2; i <= Math.sqrt(A); i++) {
        for (int j = 2; j <= (Math.log(A) / Math.log(i)); j++) {
            if ((int)Math.pow(i, j) == A)
                return 1;
        }
    }
    return (A == 1) ? 1: 0;
}

私は面接の準備をしていますし、任意のソリューションをいただければ幸い、私はより良い準備に役立ちます。あなたが考える場合にも、この問題はより速く私のアルゴリズムは、私に知らせてより行うことができます。

アビシェークガーグ:

ソリューションのAshwinを修正してくれてありがとう。

あなたは完全に再び第二のループを繰り返す必要はありませんし、唯一の値チェックを行うことができます。サンプルコードは次のようになります。

public int isPower(int a) {
        if (a == 1) {
            return 1;
        }
        for (long i = 2; i * i <= a; i++) {
            final double value = Math.log(a) / Math.log(i);
            if (value - (int) value < 0.00000001) {
                return 1;
            }
        }
        return 0;
    }

この溶液に、O(SQRT(N))の複雑。私は、これが最も効率的な解決策だと思います。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236308&siteId=1