給定乙個非負整數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)來執行此操作。
在介紹「動態規劃」之前先介紹兩種其他解法。
呼叫系統函式integer.bigcount(int i)
計算i
的二進位制位有多少個一。函式實現參考 這篇部落格。
public
int[
]countbits
(int num)
return ans;
}
手寫計算 bitcount(int x) 函式。核心**是x &= (x - 1)
,效果是去掉x
最低位的1
,通過這種方式把x
逐漸縮小到0
。
public
int[
]countbits
(int num)
return bits;
}public
intbigcount
(int x)
return count;
}
動態規劃寫法
參考**
public
int[
]countbits
(int num)
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代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...