LeetCode338. 比特位計數(二進制+動態規劃)

題目鏈接Leetcode338

在這裏插入圖片描述

思路

  1. 利用x&x-1很容易從前一個少1的數遞推過來,複雜度O(nc)O(n*c)
class Solution {
public:
    vector<int> countBits(int num) {
        //利用x&x-1快速計算比該數位小1的數然後遞推
        vector<int> ans; ans.clear();
        ans.push_back(0);
        for(int x=1; x<=num; x++)
            ans.push_back(ans[x&x-1]+1);
        return ans;
    }
};
  1. 根據奇數和偶數的二進制位的特點,對於奇數可以由前一個偶數轉移過來,對於偶數則可以由比它少最後一個0的數遞推過來
class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> ans; ans.clear();
        ans.push_back(0);
        for(int x=1; x<=num; x++)
            if(x&1) ans.push_back(ans[x-1]+1); //少一個1
            else ans.push_back(ans[x>>1]); //少一個0無影響
        return ans;
    }
};
  1. 類似法二,奇數也可以由少一個位1的數遞推過來
class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> ans; ans.clear();
        ans.push_back(0);
        for(int x=1; x<=num; x++)
            ans.push_back(ans[x>>1]+(x&1)); //少一個1

        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章