Подскажите с решением задачи LeetCode

drcosmo
Дата: 28.12.2017 12:32:08
Given a nonnegative integer number num. For every number i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.

Example:
For num = 5 you should return [0,1,1,2,1,2].

Общепринятое решение задачи:

        int[] bits = new int[num + 1];
        for (int i = 1; i <= num; i++) {
            bits[i] = bits[i >> 1] + (i & 1);
        }
        return bits;


Вопрос: почему "i >> 1" ? мы делаем сдвиг в право и как бы смотрим сколько битов было в предыдущей цифре?

но ведь тогда можно было бы просто делать bits[i - 1] и тупо брать предыдущий...

С "i&1" понятно, он сигнализирует нам о том, что в конце текущего числа стоит 1 или 0 и тут надо увеличивать/не увеличивать счетчик
drcosmo
Дата: 28.12.2017 12:37:33
drcosmo

Вопрос: почему "i >> 1" ? мы делаем сдвиг в право и как бы смотрим сколько битов было в предыдущей цифре?

но ведь тогда можно было бы просто делать bits[i - 1] и тупо брать предыдущий...



получается что тупо брать предыдущий не выйдет, поскольку число единичек не может все время расти

сам ответил на свой вопрос :)
Dima T
Дата: 28.12.2017 12:41:43
"i >> 1" это i / 2, а не предыдущий.
Изопропил
Дата: 28.12.2017 12:42:21
drcosmo,

Обоснование - негодное
drcosmo
Дата: 28.12.2017 12:47:21
Изопропил
drcosmo,

Обоснование - негодное


Да.

Не про предыдущее число надо говорить, а про число в двоичном представлении без самого правого бита. Именно его мы и рассматриваем при определении сколько будет битов в другом числе (не обязательно следующим за ним в десятичном представлении), только без сдвига
Изопропил
Дата: 28.12.2017 13:09:41
drcosmo,
f(n)=f(n/2)+lowerbit(n)