Leetcode C++《每日一題》20200626 338. 比特位計數

Leetcode C++《每日一題》20200626 338. 比特位計數

1. 題目

給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進制數中的 1 的數目並將它們作爲數組返回。

示例 1:

輸入: 2
輸出: [0,1,1]
示例 2:

輸入: 5
輸出: [0,1,1,2,1,2]
進階:

給出時間複雜度爲O(n*sizeof(integer))的解答非常容易。但你可以在線性時間O(n)內用一趟掃描做到嗎?
要求算法的空間複雜度爲O(n)。
你能進一步完善解法嗎?要求在C++或任何其他語言中不使用任何內置函數(如 C++ 中的 __builtin_popcount)來執行此操作。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/counting-bits
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2.思路

  • 動態規劃的思路,當前狀態和最近的2^n關係不小hh
  • 時間複雜度和空間複雜度都爲O(n)

3.代碼

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> res;
        int curBinary = 1;
        res.push_back(0);
        for (int i = 1; i <= num; i++) {
            if (i == curBinary) {
                res.push_back(1);
                curBinary*=2;
            }    
            else {
                int temp = i-curBinary/2;
                res.push_back(res[temp]+1);
            }
        }
        return res;
    }
};

4.debug

  • case簡單的木有過,因爲for循環else裏面的i竟然寫成了num,粗心啊
    case = 5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章