두 Leetcode 솔루션의 힘


난이도 쉽게
자주 묻는 질문 Apple
비트 조작 비트 수학

우리는 주어진 정수 목표는 정수가 XNUMX의 거듭 제곱인지 확인하는 것입니다. 즉, '의 전체 거듭 제곱으로 나타낼 수 있습니다.2'.

두 Leetcode 솔루션의 힘

16
Yes
13
No

접근

간단한 해결책은 다음과 같습니다. 정수의 모든 소인수가 모두 '2'. 이 방법의 시간 복잡도는 O (log2N). 최적의 방식으로 수행하기 위해 Bit 조작의 도움을받을 수 있습니다.

"XNUMX의 거듭 제곱 인 모든 숫자는 이진 표현에서 단일 비트 세트 만 가질 수 있습니다."

만이 있다는 것을 어떻게 확인할 수 있습니까? 단일 비트 세트 바이너리 형태로?

임의의 숫자 x를 고려하십시오.

이제 x가 XNUMX의 제곱이면 (x – 1) 모든 것을 끌 것입니다 오른쪽 비트 설정 비트에 ( '0'으로 설정) 설정 비트는 설정되지 않습니다.

x = 8 [1000], x – 1 = 7 [0111]

따라서 비트 와이즈와 x와 (x – 1)의 숫자가 XNUMX의 거듭 제곱이면 다음과 같이 말할 수 있습니다. x & (x – 1) = 0

알고리즘 (Trivial)

  1. 계속해서 숫자를 '2' 로 나눌 수 없을 때까지 '2' 더 이상.
  2. 숫자가 다음과 같으면 '1':
    • 정수는 XNUMX의 거듭 제곱입니다.
  3. 다른
    • 정수는 XNUMX의 거듭 제곱이 아닙니다.

알고리즘 (비트 조작)

  1. x & (x – 1)이 XNUMX과 같은지 확인하십시오.
    • 그렇다면 숫자는 2의 거듭 제곱입니다.
    • 정수는 2의 거듭 제곱이 아닙니다. 그렇지 않으면

실시

두 Leetcode 솔루션의 힘의 C ++ 프로그램

순진한 방법

#include <bits/stdc++.h>
using namespace std;

bool powerOfTwo(int n)
{
    while(n % 2 == 0)
        n /= 2;
    return (n == 1);
}


int main()
{
    int n = 16;
    if(powerOfTwo(n))
        cout << "Yes" << '\n';
    else
        cout << "No" << '\n';


    return 0;
}

최적의 방법

#include <bits/stdc++.h>
using namespace std;

bool powerOfTwo(int n)
{
    //16 = [10000]
    //15 = [01111]
    //16 & 15 = 0
    return (n & (n - 1)) == 0;
}


int main()
{
    int n = 16;
    if(powerOfTwo(n))
        cout << "Yes" << '\n';
    else
        cout << "No" << '\n';


    return 0;
}
Yes

두 Leetcode 솔루션의 힘의 Java 프로그램

순진한 방법

class power_of_two
{
    public static boolean powerOfTwo(int n)
    {
        while(n % 2 == 0)
            n /= 2;
        return (n == 1);
    }

    public static void main(String args[])
    {
        int n = 16;
        if(powerOfTwo(n))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}

최적의 방법

class power_of_two
{
    public static boolean powerOfTwo(int n)
    {
        return (n & (n - 1)) == 0;
    }

    public static void main(String args[])
    {
        int n = 16;
        if(powerOfTwo(n))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
Yes

복잡성 분석

두 Leetcode 솔루션의 힘의 시간 복잡성

Naive Approach의 시간 복잡성은 O (log2N), 여기서 N = 주어진 정수. 그러나 Bitwise-And가 더 빠르기 때문에 최적의 접근 방식이 더 빠릅니다. O (1).

두 Leetcode 솔루션의 힘의 공간 복잡성

프로그램에서 사용되는 공간 만 함수 서명입니다. 따라서 일정한 공간이 사용됩니다. O (1).