59
59
60
60
<!-- 这里可写通用的实现逻辑 -->
61
61
62
+ ** 方法一:动态规划**
63
+
64
+ 我们定义 $f[ i] $ 表示整数 $i$ 的二进制表示中 $1$ 的个数。那么对于一个整数 $i$,它的二进制表示中 $1$ 的个数为 $f[ i \wedge (i - 1)] + 1$,其中 $i \wedge (i - 1)$ 是将 $i$ 的二进制表示中的最低位的 $1$ 变成 $0$ 之后的数,显然 $i \wedge (i - 1) \lt i$,且 $f[ i \wedge (i - 1)] $ 已经被计算出来了,因此我们可以得到状态转移方程:
65
+
66
+ $$
67
+ f[i] = f[i \wedge (i - 1)] + 1
68
+ $$
69
+
70
+ 时间复杂度 $O(n)$,其中 $n$ 是题目给定的整数。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
71
+
62
72
<!-- tabs:start -->
63
73
64
74
### ** Python3**
68
78
``` python
69
79
class Solution :
70
80
def countBits (self , n : int ) -> List[int ]:
71
- dp = [0 for _ in range (n + 1 )]
81
+ f = [0 ] * (n + 1 )
72
82
for i in range (1 , n + 1 ):
73
- dp [i] = dp [i & (i - 1 )] + 1
74
- return dp
83
+ f [i] = f [i & (i - 1 )] + 1
84
+ return f
75
85
```
76
86
77
87
### ** Java**
@@ -81,41 +91,52 @@ class Solution:
81
91
``` java
82
92
class Solution {
83
93
public int [] countBits (int n ) {
84
- int [] dp = new int [n + 1 ];
85
- for (int i = 1 ; i <= n; i ++ ) {
86
- dp [i] = dp [i & (i - 1 )] + 1 ;
94
+ int [] f = new int [n + 1 ];
95
+ for (int i = 1 ; i <= n; ++ i ) {
96
+ f [i] = f [i & (i - 1 )] + 1 ;
87
97
}
88
- return dp ;
98
+ return f ;
89
99
}
90
100
}
91
101
```
92
102
103
+ ### ** C++**
104
+
105
+ ``` cpp
106
+ class Solution {
107
+ public:
108
+ vector<int > countBits(int n) {
109
+ vector<int > f(n + 1);
110
+ for (int i = 1; i <= n; ++i) {
111
+ f[ i] = f[ i & (i - 1)] + 1;
112
+ }
113
+ return f;
114
+ }
115
+ };
116
+ ```
117
+
93
118
### **Go**
94
119
95
120
```go
96
121
func countBits(n int) []int {
97
- dp := make ([]int , n+1 )
122
+ f := make([]int, n+1)
98
123
for i := 1; i <= n; i++ {
99
- dp [i] = dp [i&(i-1 )] + 1
124
+ f [i] = f [i&(i-1)] + 1
100
125
}
101
- return dp
126
+ return f
102
127
}
103
128
```
104
129
105
- ### ** C++**
106
-
107
- ``` cpp
108
- class Solution {
109
- public:
110
- vector<int > countBits(int n) {
111
- vector<int > res(n + 1);
112
- for (int i = 1; i <= n; i++) {
113
- res[ i] = res[ i & (i - 1)] + 1;
114
- }
130
+ ### ** TypeScript**
115
131
116
- return res;
132
+ ``` ts
133
+ function countBits(n : number ): number [] {
134
+ const f: number [] = Array (n + 1 ).fill (0 );
135
+ for (let i = 1 ; i <= n ; ++ i ) {
136
+ f [i ] = f [i & (i - 1 )] + 1 ;
117
137
}
118
- };
138
+ return f ;
139
+ }
119
140
```
120
141
121
142
### ** ...**
0 commit comments