zoukankan      html  css  js  c++  java
  • [LeetCode 338.] 比特位计数

    LeetCode 338. 比特位计数

    一道简单题,但是把位运算和DP结合起来,很有意思。

    题目描述

    给定一个非负整数 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)来执行此操作。

    解题思路

    思路一:n & (n-1)

    看到题目的第一眼,会觉得眼熟,因为这不就是计算二进制位中1的个数的题目嘛!对于每一个数,计算的时候只需要每次利用 n &= (n-1) 消去最低位的1,重复操作直到n变成0,操作的次数就是1的个数。对于n个数,每一个都如此计算,时间开销基本可以看作 O(n)。

    思路二:DP

    思路一中,我们认为时间开销是 O(n) 是因为我们把每一个数字的计数都看作了 O(1) 开销,因为每个数字的计数次数上线就是int类型是数据宽度32。
    这里题目让我们进一步优化时间复杂度,希望降低到每个数字只用一次位运算的时间,可能吗?
    只有一个数字显然不行,但是连续数组的话是可以的,用DP即可!
    对于数字n,考察其最低位,如果为0,则n中1的个数和 n/2 相同,否则需要再+1。

    参考代码

    /*
     * @lc app=leetcode.cn id=338 lang=cpp
     *
     * [338] 比特位计数
     */
    
    class Solution {
    public:
    /*
        vector<int> countBits(int n) {
            vector<int> cnt(n+1, 0);
            for (int i=0; i<=n; i++) {
                int x = i;
                while (x) {
                    cnt[i] ++;
                    x &= (x-1);
                }
            }
            return cnt;
        } // AC, O(n*sizeof(integer))
    */
        vector<int> countBits(int n) {
            vector<int> cnt(n+1, 0);
            for (int i=1; i<=n; i++) {
                cnt[i] = (i & 1) + cnt[i >> 1];
            }
            return cnt;
        } // AC, O(n), DP
    };
    // @lc code=end
    
  • 相关阅读:
    PAT (Advanced Level) 1114. Family Property (25)
    PAT (Advanced Level) 1113. Integer Set Partition (25)
    PAT (Advanced Level) 1112. Stucked Keyboard (20)
    PAT (Advanced Level) 1111. Online Map (30)
    PAT (Advanced Level) 1110. Complete Binary Tree (25)
    PAT (Advanced Level) 1109. Group Photo (25)
    PAT (Advanced Level) 1108. Finding Average (20)
    PAT (Advanced Level) 1107. Social Clusters (30)
    PAT (Advanced Level) 1106. Lowest Price in Supply Chain (25)
    PAT (Advanced Level) 1105. Spiral Matrix (25)
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15252322.html
Copyright © 2011-2022 走看看