Non-negative Integers without Consecutive Ones

n位二进制,求不包含连续1的二进制(n位)数字个数。

http://www.geeksforgeeks.org/count-number-binary-strings-without-consecutive-1s/

也可以令f[i],表示共i位的二进制数字中,不包含连续1的二进制(i位)数字的个数。

  f[i]的组成有两部分:

    最高位为1:只有当次高位为0,且满足条件的二进制数字个数,即 f[i-2]

    最高位为0:次高位为0或1且满足条件的数字个数,即f[i-1]

  得: f[i] = f[i-2] + f[i-1]

给定num,求1~num的数字中,求对应的二进制不包含连续1的数字个数。

600. Non-negative Integers without Consecutive Ones

Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT containconsecutive ones.

Example 1:

Input: 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. 

Note: 1 <= n <= 109

题目:

https://leetcode.com/contest/leetcode-weekly-contest-34/problems/non-negative-integers-without-consecutive-ones/

给定的数字num,转换成二进制,共n位。

首先由上一题的结论,得到f[i],1 <= i < n

假设数字num为从高位到低位B: bn-1, bn-2, ..., 3,2,1

   应该在比num小或相等的数字中,计算没有连续二进制1的数字的个数。

   从高位到低位,遍历B,如果遇到1,则对应位改变为0后,则肯定比原num小。

     如:10110,从高到低遍历二进制位

       第一个1,前缀变为0,剩下四位,比原来的num小,则满足条件的数字个数为f(4)

     第二个1,前缀变为100,剩下两位,100XX,比原来的num小,则满足条件的数字个数为f(2)

       第三个1,前缀变为1010,剩下一位,1010X,比原来的num小,则满足条件的数字个数为f(1)

       遍历过程中,当遇到两个连续的1时需要中止遍历。如原num为1XX11XXX,继续遍历找到后面的1并改变为0,得到的数字确实比num小,但不满足不存在连续1的条件。

     遍历过程中,考虑的都是比原num小的数,最后还需要判断一下原num是否符合条件。

    int findIntegers(int num) {
        vector<int> b_num;
        //int tmp = num;
        while( num != 0 )
        {
            b_num.push_back( num % 2 );
            num /= 2;
        }
        int f[32] = { 0 };
        f[0] = 1;
        f[1] = 2;
        int n = b_num.size();
        for( int i = 2; i < n; i++ )
        {
            f[i] = f[i-1] + f[i-2];
        }
        int ans = 0;

        int has_d_one = false;
        for( int i = n-1; i >= 0; i-- )
        {
            if( b_num[i] )
            {
                ans += f[i];
                if( i < n-1 )
                {
                    if( b_num[i+1] )
                    {
                        has_d_one=true;
                        break;
                    }
                }

            }
        }

        //判断一下num自身是否含连续1
        //if( !( tmp & (tmp<<1) ) )
        //{
        //    ans++;
        //}
        if( !has_d_one )
        {
            ans++;
        }
        return ans;
    }
时间: 2024-11-13 02:40:38

Non-negative Integers without Consecutive Ones的相关文章

[LeetCode] Non-negative Integers without Consecutive Ones 非负整数不包括连续的1

Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT contain consecutive ones. Example 1: Input: 5 Output: 5 Explanation: Here are the non-negative integers <= 5 with their

600. Non-negative Integers without Consecutive Ones

Problem statement: Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT contain consecutive ones. Example 1: Input: 5 Output: 5 Explanation: Here are the non-negative intege

第十六周 Leetcode 600. Non-negative Integers without Consecutive Ones(HARD) 计数dp

Leetcode600 很简单的一道计数题 给定整数n 求不大于n的正整数中 二进制表示没有连续的1的数字个数 在dp过程中只要保证不出现连续1以及大于n的情况即可. 所以设计按位dp[i][j]表示到第i位 j=0表示第i位为0 且值等于n的情况 2为值小于n的情况 j=1表示第i位为1 且值等于n的情况 3为值小于n的情况 转移方程很简单 看代码吧 这道题应该是Mid难度吧 class Solution { public: int findIntegers(int num) { int va

[Algorithm] Count Negative Integers in Row/Column-Wise Sorted Matrix

Each row and each column are already SORTED in the given matrix! const mix = [[-3, -2, -1, 3], [-1, 0, 1, 3], [0, 2, 4, 5]]; /** * Start from top right slot, go from right to left, top to bottom * case 1; If the current value is larger than 0, keep m

Interleaving Positive and Negative Numbers

Given an array with positive and negative integers. Re-range it to interleaving with positive and negative integers. Note: You are not necessary to keep the original order of positive integers or negative integers. Example Given [-1, -2, -3, 4, 5, 6]

LintCode-Interleaving Positive and Negative Numbers.

Given an array with positive and negative integers. Re-range it to interleaving with positive and negative integers. Note You are not necessary to keep the original order or positive integers or negative integers. Example Given [-1, -2, -3, 4, 5, 6],

Lintcode: Interleaving Positive and Negative Numbers 解题报告

Interleaving Positive and Negative Numbers 原题链接 : http://lintcode.com/zh-cn/problem/interleaving-positive-and-negative-numbers/ Given an array with positive and negative integers. Re-range it to interleaving with positive and negative integers. 注意 Yo

[leetcode]Interleaving Positive and Negative Numbers

Given an array with positive and negative integers. Re-range it to interleaving with positive and negative integers. Note You are not necessary to keep the original order or positive integers or negative integers. Example Given [-1, -2, -3, 4, 5, 6],

hdu5074 Hatsune Miku 2014鞍山现场赛E题 水dp

http://acm.hdu.edu.cn/showproblem.php?pid=5074 Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 325    Accepted Submission(s): 243 Problem Description Hatsune Miku is a popular vi