Algorithm/dp

리트코드 338. Counting Bits c++ // 1의갯수세기, dp, 비트

Mini_96 2024. 5. 21. 22:53

https://leetcode.com/problems/counting-bits/description/

1. 비트 구현 풀이

1. 각각 숫자에대해 

2진수를 구하면서 1의 갯수를 계산한다.

O(n lgn)

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> ret;

        for(int i=0;i<=n;++i){
            int cnt=0;
            int num=i;
            while(num){
                if(num%2==1) cnt++;
                num/=2;
            }
            ret.push_back(cnt);
        }
        
        return ret;

    }
};

 

2. dp풀이

*행동영역 : n이 홀짝일때를 나눠서 규칙을 발견해라!

n==0인 기저사례 처리 주의.

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> dp(n+1,0);
        if(n==0) return dp;

        dp[0]=0;
        dp[1]=1;
        for(int i=2;i<=n;++i){
            if(i%2==0){
                dp[i]=dp[i/2];
            }
            else{
                dp[i]=dp[i/2]+1;
            }
        }
        
        return dp;
        
    }
};