LeetCode#338 Counting Bits题解(C++版)
来源:互联网 发布:2004美国vs阿根廷数据 编辑:程序博客网 时间:2024/06/06 20:45
题干
原题网址:
https://leetcode.com/problems/counting-bits/description/
题干解析
给你一个非负整数num,要你返回一个向量,这个向量的数据代表在[0, num]中每个数的二进制写法中“1”的个数。
知识点
逻辑
难度
中等
解题思路
这道题用暴力解法可以说是非常简单的了,但是题干要求,不能用暴力解法,要让时间复杂度和空间复杂度都是O(n),这就需要想一种更为高效的算法。其实我的解法有点像“找规律”,通过列出0-16的二进制数的“1”的个数{0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4},我们可以发现以下规律:其实大于等于2的k次方、小于2的k+1次方之间的二进制数的“1”的个数,正好是大于等于0、小于2的k次方的数每个数对应加一得来,比如:当k等于1时,2的k次方等于2,2的k+1次方等于4,那么[2, 4)中(即2和3)的二进制数的“1”的个数是{1,2},[0, 2)中(即0和1)的二进制数的“1”的个数是{0,1},也就是{0,1}的中的两项各加1即可得{1,2}。发现这个规律之后我们就可以愉快地在时间复杂度和空间复杂度为O(n)的限制下得到我们要的解了。
代码
class Solution {public: vector<int> countBits(int num) { vector<int> ans; int index = 0; for (int i = 0; i <= num; i++) { if (i == 0) { ans.push_back(0); continue; } if (i == pow(2, index)) { index++; } ans.push_back(1 + ans[i - pow(2, index - 1)]); } return ans; }};
阅读全文
0 0
- LeetCode 338.Counting Bits 题解(C++)
- LeetCode#338 Counting Bits题解(C++版)
- LeetCode题解:Counting Bits
- 【LeetCode-338】Counting Bits(C++)
- leetcode 338 c++. Counting Bits
- LeetCode中338Counting Bits的题解
- 【LeetCode题解】338.Counting Bits
- [C]LeetCode:Counting Bits
- leetcode:bits:Counting Bits(338)
- LeetCode:338. Counting Bits(C++)
- 【LeetCode-338】Counting Bits
- leetcode-338-Counting Bits
- Leetcode 338 Counting Bits
- LeetCode 338 :Counting Bits
- [leetcode-338]Counting Bits
- 【LeetCode-338】 Counting Bits
- LeetCode 338 Counting Bits
- Counting Bits leetcode 338
- 设计思想学习—建造者模式
- 把obj,mtl格式导入Blender,修改,然后导出为COLLADA(.dae),写urdf,最后导入Gazebo
- 孤儿进程/僵尸进程
- AC自动机(Trie图)
- Appium-常见API的Python用法(一)
- LeetCode#338 Counting Bits题解(C++版)
- 数据结构实验之查找七:线性之哈希表
- R之核密度图
- Spark Dataset介绍和使用
- ZD的情况记录
- TCP四次挥手原理
- 第5章 连接控制:学习stty
- java中协变与逆变
- vsftpd.conf配置文件详解