Skip to content

Commit c5b1791

Browse files
author
wangpeng
committed
feat(MEDIUM): add _338_countBits
1 parent 3df6339 commit c5b1791

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package pp.arithmetic.leetcode;
2+
3+
import pp.arithmetic.Util;
4+
5+
/**
6+
* Created by wangpeng on 2019-05-13.
7+
* 338. 比特位计数
8+
* <p>
9+
* 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
10+
* <p>
11+
* 示例 1:
12+
* <p>
13+
* 输入: 2
14+
* 输出: [0,1,1]
15+
* 示例 2:
16+
* <p>
17+
* 输入: 5
18+
* 输出: [0,1,1,2,1,2]
19+
* 进阶:
20+
* <p>
21+
* 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
22+
* 要求算法的空间复杂度为O(n)。
23+
* 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。
24+
*
25+
* @see <a href="https://leetcode-cn.com/problems/counting-bits/">counting-bits</a>
26+
*/
27+
public class _338_countBits {
28+
public static void main(String[] args) {
29+
_338_countBits countBits = new _338_countBits();
30+
Util.printArray(countBits.countBits(2));
31+
Util.printArray(countBits.countBits(5));
32+
}
33+
34+
/**
35+
* 题目已经强调了需要O(n)的复杂度,只能遍历一遍,可以考虑动态规划
36+
* 根据题目意思,先手动画一下数字和2进制的具体映射关系
37+
* 数字 0 1 2 3 4 5 6 7 8
38+
* 二进 0 1 10 11 100 101 110 111 1000
39+
* 1个数 0 1 1 2 1 2 2 3 1
40+
* 根据递推效果,看着好像没有什么规律
41+
* 但是仔细思考下,10进制转2进制必须要除以2,有些能整除,有些不能整除
42+
* 不能整除的3的1个数=3/1=数字1的1个数+1
43+
* 能整除的4的的1个数=4/2=数字2的1个数
44+
* 拿其他数字验证后发现的确是这个规律,得到动态规划状态转移方程:
45+
* int d = i / 2;
46+
* int m = i % 2;
47+
* if (m == 0) {
48+
* dp[i] = dp[d];
49+
* } else {
50+
* dp[i] = dp[d] + 1;
51+
* }
52+
*
53+
* @param num
54+
* @return
55+
*/
56+
public int[] countBits(int num) {
57+
if (num < 0) return new int[0];
58+
int[] dp = new int[num + 1];
59+
dp[0] = 0;
60+
for (int i = 1; i <= num; i++) {
61+
int d = i / 2;
62+
int m = i % 2;
63+
if (m == 0) {
64+
dp[i] = dp[d];
65+
} else {
66+
dp[i] = dp[d] + 1;
67+
}
68+
}
69+
70+
return dp;
71+
}
72+
}

0 commit comments

Comments
 (0)