leecode/backlog/338.counting-bits.js
2020-05-22 18:17:19 +08:00

68 lines
1.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @lc app=leetcode id=338 lang=javascript
*
* [338] Counting Bits
*
* https://leetcode.com/problems/counting-bits/description/
*
* algorithms
* Medium (64.04%)
* Total Accepted: 163.1K
* Total Submissions: 253K
* Testcase Example: '2'
*
* Given a non negative integer number num. For every numbers i in the range 0
* ≤ i ≤ num calculate the number of 1's in their binary representation and
* return them as an array.
*
* Example 1:
*
*
* Input: 2
* Output: [0,1,1]
*
* Example 2:
*
*
* Input: 5
* Output: [0,1,1,2,1,2]
*
*
* Follow up:
*
*
* It is very easy to come up with a solution with run time
* O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a
* single pass?
* Space complexity should be O(n).
* Can you do it like a boss? Do it without using any builtin function like
* __builtin_popcount in c++ or in any other language.
*
*/
/**
* @param {number} num
* @return {number[]}
*/
var countBits = function(num) {
// tag: bit dp
// Time complexity: O(n)
// Space complexity: O(n)
const res = [];
res[0] = 0;
// 10000100110101
for (let i = 1; i <= num; i++) {
if ((i & 1) === 0) {
// 偶数
// 偶数最后一位是0因此右移一位对结果没有影响
res[i] = res[i >> 1];
} else {
// 奇数
// 奇数最后一位是1i - 1 的 位数 + 1 就是结果
res[i] = res[i - 1] + 1;
}
}
return res;
};