600. Non-negative Integers without Consecutive Ones
Description
Given a positive integer n
, return the number of the integers in the range [0, n]
whose binary representations do not contain consecutive ones.
Example 1:
Input: n = 5 Output: 5 Explanation: Here are the non-negative integers <= 5 with their corresponding binary representations: 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101 Among them, only integer 3 disobeys the rule (two consecutive ones) and the other 5 satisfy the rule.
Example 2:
Input: n = 1 Output: 2
Example 3:
Input: n = 2 Output: 3
Constraints:
1 <= n <= 109
Solutions
Solution: Dynamic Programming
- Time complexity: O(logn)
- Space complexity: O(logn)
JavaScript
js
/**
* @param {number} n
* @return {number}
*/
const findIntegers = function (n) {
const bits = n.toString(2);
const size = bits.length;
const zeros = new Array(size).fill(0);
const ones = new Array(size).fill(0);
zeros[0] = ones[0] = 1;
for (let index = 1; index < size; index++) {
zeros[index] = zeros[index - 1] + ones[index - 1];
ones[index] = zeros[index - 1];
}
let result = zeros[size - 1] + ones[size - 1];
for (let index = 1; index < size; index++) {
const current = bits[index];
const previous = bits[index - 1];
if (current === '1' && previous === '1') return result;
if (current === '0' && previous === '0') {
result -= ones[size - index - 1];
}
}
return result;
};