leetcode--338. 比特位计数
生活随笔
收集整理的這篇文章主要介紹了
leetcode--338. 比特位计数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個非負整數?num。對于?0 ≤ i ≤ num?范圍中的每個數字?i?,計算其二進制數中的 1 的數目并將它們作為數組返回。
示例 1:
輸入: 2 輸出: [0,1,1]示例?2:
輸入: 5 輸出: [0,1,1,2,1,2]進階:
- 給出時間復雜度為O(n*sizeof(integer))的解答非常容易。但你可以在線性時間O(n)內用一趟掃描做到嗎?
- 要求算法的空間復雜度為O(n)。
- 你能進一步完善解法嗎?要求在C++或任何其他語言中不使用任何內置函數(如 C++ 中的?__builtin_popcount)來執行此操作。
大佬:horanol
這道題有兩種位運算思路,都是利用數組前面已經算好的數來計算當前數的1的個數
- 方法一:i & (i - 1)可以去掉i最右邊的一個1(如果有),因此 i & (i - 1)是比 i 小的,而且i & (i - 1)的1的個數已經在前面算過了,所以i的1的個數就是 i & (i - 1)的1的個數加上1
- 方法二:i >> 1會把最低位去掉,因此i >> 1 也是比i小的,同樣也是在前面的數組里算過。當 i 的最低位是0,則 i 中1的個數和i >> 1中1的個數相同;當i的最低位是1,i 中1的個數是 i >> 1中1的個數再加1
總結
以上是生活随笔為你收集整理的leetcode--338. 比特位计数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode -- 303. 区域和
- 下一篇: leetcode--121. 买卖股票的