码迷,mamicode.com
首页 > 其他好文 > 详细

600. Non-negative Integers without Consecutive Ones

时间:2017-05-29 09:52:27      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:not   tput   ==   set   after   nes   logs   code   weekly   

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 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 <= 10^9

Solution:

This is the last question of leetcode weekly contest 34. It is a DP and definitely is hard problem. But, the DP formula is not difficult to figure it out. What we need to be careful is there is one requirement in the description: less than or equal  to n.  After we get the answer, we still need to do one more step.

Generally, this problem can be divided into several steps:

(1) Convert the original n into a binary representation string. Get the size of string to allocate memory for DP array.

(2)Do DP, like 198. House Robber, we should define two dp arrays:

  • dp0[i]: the number of integers when current bit set to 0
  • dp1[i]: the number of integers when current bit set to 1

(3)Any integer can not contain any consecutive ones.

  • dp0[i] = dp1[i - 1] + dp0[i - 1]
  • dp1[i] = dp0[i - 1]

(4) And do the last processing to find the integers which are less than or equal to n.

Time complexity is O(k), k is the bit count of n.

class Solution {
public:
    int findIntegers(int num) {
        string str_num;
        while(num){
            str_num.push_back(num % 2 + 0);
            num /= 2;
        }
        int size = str_num.size();
        vector<int> dp0(size, 0);
        vector<int> dp1(size, 0);
        dp0[0] = 1;
        dp1[0] = 1;
        for(int i = 1; i < size; i++){
            dp0[i] = dp0[i - 1] + dp1[i - 1];
            dp1[i] = dp0[i - 1];
        }
        int cnt = dp0[size - 1] + dp1[size - 1];
        for (int i = size - 2; i >= 0; i--) {
            if (str_num[i] == 1 && str_num[i + 1] == 1) {
                break;
            }
            if (str_num[i] == 0 && str_num[i + 1] == 0) {
                cnt -= dp1[i];
            }
        }
        return cnt;
    }
};

 

600. Non-negative Integers without Consecutive Ones

标签:not   tput   ==   set   after   nes   logs   code   weekly   

原文地址:http://www.cnblogs.com/wdw828/p/6917290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!