File tree Expand file tree Collapse file tree 1 file changed +72
-0
lines changed
src/pp/arithmetic/leetcode Expand file tree Collapse file tree 1 file changed +72
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments