338. Counting Bits (Medium)

https://leetcode.com/problems/counting-bits/

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.

Example 1:

Input: 2
Output: [0,1,1]

Example 2:

Input: 5
Output: [0,1,1,2,1,2]

Follow up:

  • It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
  • Space complexity should be O(n).
  • Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.

Solutions

class Solution {

    // Following solution is ingenious. Through careful observation, we will find that current elements can
    // make use of previous element results, say num using num>>1. 

    public int[] countBits(int num) {

        // from 0 (inclusive) to num (inclusive)
        int[] ans = new int[num + 1];
        Arrays.fill(ans, 0);

        if (num == 0) {
            return ans;
        }

        for (int i = 1; i <= num; i++) {

            // if ans[i] is even, share same quantity of 1s with ans[i>>1], also can be expressed ans[i / 2]
            if ((i & 1) == 0) {
                ans[i] = ans[i >> 1];
            }
            //if ans[i] is odd, the carries one more 1 than previous number ans[i-1]
            else {
                ans[i] = ans[i - 1] + 1;
            }
        }

        return ans;
    }
}

Incorrect Solutions

References

Copyright © iovi.com 2017 all right reserved,powered by GitbookLast Modification: 2020-03-22 00:30:05

results matching ""

    No results matching ""