338. Counting Bits_比特位计数_简单动态规划

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

这是初步了解动态规划后做的第一道题,体验还不错。。。

看完题目要求后,写出前10个数的二进制数,发现了以下规律:

  • 2的幂的二进制数中只有一个1
  • 若n不是2的幂,可以拆分为两个数的和(a+b),a为比n小的最接近的2的幂

拆分后,res[n] = res[a] + res[b]

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

原文地址:https://www.cnblogs.com/tornado549/p/10423811.html

时间: 2024-10-03 10:13:43

338. Counting Bits_比特位计数_简单动态规划的相关文章

338.比特位计数( Counting Bits)leetcode

附上:题目地址:https://leetcode-cn.com/problems/counting-bits/submissions/ 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)内用一趟

Leetcode——338. 比特位计数

题目描述:题目链接 对于求解一个十进制数转化为二进制时里面1的个数,可以先看一下概况: 十进制数 二进制数 1的个数 1 1    1 2 10 1 3 11   2 4 100 1 5 101 2 6 110   2 7 111   3 看上面的一系列数字的二进制中1的个数: 对于一个偶数 n :其二进制组成最低位为0,所以其1的位数就是除了最低位之外前面那一部分中1的位数,即是i/2中1的位数. 对于一个奇数n,其末位的数一定是1,那么对于n-1,一定是个偶数,并且只需要将n-1的末位0改成

[Swift]LeetCode338. 比特位计数 | Counting Bits

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array. Example 1: Input: 2 Output: [0,1,1] Example 2: Input: 5 Output: [0,1,1,2,1,2

338. 比特位计数

定一个非负整数 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++ 中的 __bui

[Leetcode] 第338题 比特位计数

一.题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: 5 输出: [0,1,1,2,1,2] 二.题目分析 1)发现规律:2的幂1的数目一定是1个,用last_2记录最近出现的2的幂2)dp[i]=1+dp[i-last_2],比如dp[7]=1+dp[3] 三.代码实现 1 class Solution { 2 public: 3 v

【LeetCode】338. 比特位计数(位运算)

给定一个非负整数?num.对于?0 ≤ i ≤ num 范围中的每个数字?i?,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例?2: 输入: 5 输出: [0,1,1,2,1,2] 解法1:使用库函数 class Solution { public int[] countBits(int num) { int[] arr = new int[num + 1]; for(int i = 0; i <= num; i++){ arr[i]

leetcode-338. 比特位计数

给定一个非负整数 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++ 中的 __bu

比特位计数

目录 题目描述 示例 示例 1 示例 2 题解 代码 题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 输入 输入一个非负整数 num 输出 输出 0 ~ num 中的每一个数字对应二进制数的 1 的数目 示例 1 输入: 2 输出: 0 1 1 示例 2 输入: 5 输出: 0 1 1 2 1 2 题解 由于 n & (n - 1) 可以消去 n 对应的二进制数的最后一位 1 ,那么以此可以求出

比特位(Bit)的妙用

关于比特位算法,在<编程珠玑>中有很多地方都提到了利用比特位存储数据的算法(这本书中称之为位向量),例如第1章中利用比特位实现一个内存占用小的磁盘查找程序,第13章利用比特位实现集合等待.在很多地方,都可以利用比特位来巧妙地实现一些算法,大大提高算法的执行效率,下面举两个例子说明(题目来源于LeetCode): LeetCode 85:Maximal Rectangle 这道题目意思是:给定一个只有0和1的矩阵,求出含有1最多的子矩阵的面积(即求出该矩阵中含有的1的个数). 初看这道题目,我立