題目描述
給定乙個非負整數num。對於0 ≤ i ≤ num範圍中的每個數字i,計算其二進位制數中的 1 的數目並將它們作為陣列返回。
示例1
輸入: 2示例2輸出: [0,1,1]
輸入: 5高階提示輸出: [0,1,1,2,1,2]
要求演算法的空間複雜度為o(n)。
你能進一步完善解法嗎?要求在c++或任何其他語言中不使用任何內建函式(如 c++ 中的 __builtin_popcount)來執行此操作。
分析
要在一次線性掃瞄的時間內解決問題,也就是說直接一次性往陣列內遍歷賦值。
所以需要找尋賦值規律。
1. 動態規劃-低位有效判斷
我們先來看這樣乙個例子公式解釋:很容易可以得到遞推公式:
bits[i] = bits[i >> 1] + (i & 1)
**
func countbits(num int) int
return bits
}
2. 動態規劃-設定最低有效位1 & 0 = 001 & 000 = 0 = 000公式解釋:2 & 1 = 010 & 001 = 0 = 000
3 & 2 = 011 & 010 = 2 = 010
4 & 3 = 100 & 011 = 0 = 000
5 & 4 = 101 & 100 = 4 = 100
6 & 5 = 110 & 101 = 4 = 100
7 & 6 = 111 & 110 = 6 = 110
8 & 7 = 1000 & 0111 = 0 = 0000
不難看出乙個規律
n & n-1 得到乙個數,這個數就是將n 的最末位的1變成0的結果
所以我們可以得到這樣乙個遞推公式:
bits[i] = bits[i & [i-1]] + 1
**
func countbits(num int) int
return bits
}
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
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...