位操作型動態規劃——位元位計數
阿新 • • 發佈:2021-02-04
給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。
示例 1:
輸入: 2
輸出: [0,1,1]
1、題目分析
從題目中的二進位制數能夠比較明顯的看出該題目屬於位操作型動態規劃,同時屬於計數型的動態規劃
2、確定狀態
這個的最後一步應該很好理解,就是它的最後一位二進位制位,舉個例子:
170=10101010,它的最後一位是0,去掉它的最後一位則剩下的數就是85=1010101。
因此我們如果要求170的二進位制有多個1,只需要求出去掉它的最後一位之後的85的二進位制有多少個1,然後加上剛剛去掉的那位。如果去掉的那位是1的話則,170的1的個數就等於85的一個的個數+1;如果是0,則170的1的個數就等於85 的個數。然而要知道最後一位是1還是0 ,只需要該數除以2即可判斷
3、轉移方程
假設f[i]表示i的二進位制中有多少個1
4、初始條件和邊界情況
初始條件:f[0]=0
5、計算順序
同樣是從小到大計算,因為計算f[i]的1的個數,需要知道f[i/2]的1的個數
6、程式碼實現
class Solution:
def countBits(self, num: int) -> List[int]:
dp = [0 for i in range(num+1)]
for i in range(1,num+1):
if i%2==1:
dp[i]=dp[i//2]+1
else :
dp[i]=dp[i//2]
return dp