正整數 i
i&(i-1) 是去掉 i二進位制表示序列 從左往右第乙個1.所以說i+1也不會發生進製,那麼我們只要統計 i&(i-1) 裡面1的個數,在加上1,就是 i 的二進位制表示中 1的個數。i&(i-1) 的結果比 i小,所以只要將 比 i小的整數的1的個數 存放在陣列裡面,在計算整數 i中 1的個數的時候,可以用到 前面部分的陣列。
舉例說明是去掉從左往右第乙個1
7:111
7-1:110
111&110 = 110(去掉7的從左往右第乙個1)
6:110
5:101
110&101 = 100(去掉6的從左往右第乙個1)
下面是發現規律:陣列從1開始存放,陣列的索引就是整數,對應索引的值就是1的個數
0 :a[0] = 0
1 :001 i&(i-1)=000,,a[1] = a[i&(i-1)]+1
2 :010 i&(i-1)=000=0(十進位制), i&(i-1) < i,i之前的整數 1的個數已經統計過了,而且i&(i-1) 是去掉i二進位制序列從右往左第乙個1,所以只要 a[i&(i-1)]+1 = i 的1 的個數
後面類似
class solution
return res;
}};
時間複雜度分析:o(k)
class solution
return res;
}};
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 最近...