..
600. Non-negative Integers without Consecutive Ones
Problem 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 <= 10^9
Solution
Check this video out.
Python
class Solution:
def findIntegers(self, n: int) -> int:
if n < 2:
return n + 1
bits = bin(n).replace('0b', '')
bits = bits[::-1]
k = len(bits)
f = [0] * k
f[0] = 1
f[1] = 2
for i in range(2, k):
f[i] = f[i - 1] + f[i - 2]
ans = 0
for i in range(k - 1, -1, -1):
if bits[i] == '1':
ans += f[i]
if i < k - 1 and bits[i + 1] == '1':
return ans
ans += 1
return ans
Java
class Solution {
public int findIntegers(int n) {
StringBuilder sb = new StringBuilder(Integer.toBinaryString(n)).reverse();
int n = sb.length();
int a[] = new int[n];
int b[] = new int[n];
a[0] = b[0] = 1;
for (int i = 1; i < n; i++) {
a[i] = a[i - 1] + b[i - 1];
b[i] = a[i - 1];
}
int result = a[n - 1] + b[n - 1];
for (int i = n - 2; i >= 0; i--) {
if (sb.charAt(i) == '1' && sb.charAt(i + 1) == '1') break;
if (sb.charAt(i) == '0' && sb.charAt(i + 1) == '0') result -= b[i];
}
return result;
}
}
Complexity Analysis
- Time Complexity
- O(len(bits))
- Space Complexity
- O(1)