Leetcode題目338 位元位計數(中等)

2022-03-26 12:53:21 字數 809 閱讀 9803

題目描述:

給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

示例 1:

輸入: 2

輸出: [0,1,1]

示例 2:

輸入: 5

輸出: [0,1,1,2,1,2]

高階:要求演算法的空間複雜度為o(n)。

你能進一步完善解法嗎?要求在c++或任何其他語言中不使用任何內建函式(如 c++ 中的 __builtin_popcount)來執行此操作。

思路分析:

對於所有的數字,只有兩類:

奇數:二進位制表示中,奇數一定比前面那個偶數多乙個 1,因為多的就是最低位的 1。

舉例:

0 = 0 1 = 1

2 = 10 3 = 11

偶數:二進位制表示中,偶數中 1 的個數一定和除以 2 之後的那個數一樣多。因為最低位是 0,除以 2 就是右移一位,也就是把那個 0 抹掉而已,所以 1 的個數是不變的。

舉例:

2 = 10 4 = 100 8 = 1000

3 = 11 6 = 110 12 = 1100

另外,0 的 1 個數為 0,於是就可以根據奇偶性開始遍歷計算了。

**實現:

class solution  else 

}return res;

}}

時間複雜度:o(n)

空間複雜度:o(n)

leetcode338 位元位計數

給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 高階 思路 首先是乙個數減1,對應二進位制的變化就是最右的乙個1變為0,而這個1右邊的所...

Leetcode 338 位元位計數

給定乙個非負整數num。對於0 i num範圍中的每個數字i,計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2輸出 0,1,1 示例 2 輸入 5輸出 0,1,1,2,1,2 高階 要求演算法的空間複雜度為o n 你能進一步完善解法嗎?要求在c 或任何其他語言中不使用任何內建...

leetcode 338 位元位計數

思路 對應數字n的二進位制中1的位數是有規律的。0的位數為0。1是2的0次冪,2是2的1次冪。因此,只要是2的冪的數的二進位制中1的位數都是1。那麼對應地,3的二進位制中1的位數就是2的位數加上1的位數 同理,7的二進位制中1的位數就是4的位數加上3的位數,使用動態規劃得解 dp n dp n 最近...