Skip to content

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;
};

Released under the MIT license