演算法 位元位計數

2021-10-04 17:58:28 字數 689 閱讀 8954

338. 位元位計數

給定乙個非負整數 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)來執行此操作。

題意就是讓我們把0-n之間的所有數的為1的位的個數填到乙個陣列裡面,然後返回

挨個計算肯定是有點麻煩,所以要有更有效的解法:動態規劃:用dp[i]表示當前數字含有1的位數。

想象一下,如果當前數為奇數,那麼當前數字的位比前乙個數字的位多了乙個1

也就是:dp[i]=dp[i-1]+1;

如果當前數為偶數,那麼它是前面i/2向左移動了一位,沒有新的貢獻1

也就是:dp[i]=dp[i>>1];

搞明白之後就很好解決了,核心**只有一行。

public

int[

]countbits

(int num)

return dp;

}

位元位計數

一 題目描述 二 題目分析 題解參考 自己分析沒分析出來,看完題解,忍不住妙出了聲。對於數字有兩類,偶數與奇數,從二進位制的角度看,奇數的二進位制標示肯定比前面乙個偶數多1,因為偶數的最低為0,而因為最低為為0,則讓乙個偶數的二進位制1的個數一定和自身除以2後的二進位制1的個數相等。通過上面這兩個特...

位元位計數

位元位計數 給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。題解 這種題如果不加限制的話可以選擇移位 1的方式計算1的個數 但是要求是在o n 的時間複雜度下完成就需要腦筋急轉彎啦 0000 0 0001 1 0000 00...

位元位計數

給定乙個非負整數 num。對於 0 i num 範圍中的每個數字 i 計算其二進位制數中的 1 的數目並將它們作為陣列返回。示例 1 輸入 2 輸出 0,1,1 示例 2 輸入 5 輸出 0,1,1,2,1,2 1.暴力法 intisbinary int n return count int cou...