leecode/backlog/338.counting-bits.js

68 lines
1.4 KiB
JavaScript
Raw Normal View History

2020-05-22 18:17:19 +08:00
/*
* @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;
};