前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 338 Counting Bits

LeetCode 338 Counting Bits

作者头像
一份执着✘
发布2019-12-29 20:15:07
3390
发布2019-12-29 20:15:07
举报
文章被收录于专栏:赵俊的Java专栏赵俊的Java专栏

比特位计数

题意

给定一个非负整数 num. 对于 0 ≤ i ≤ num 范围中的每个数字 i, 计算其二进制数中的 1 的数目并将它们作为数组返回.

示例 1:

代码语言:javascript
复制
输入: 2
输出: [0,1,1]

示例 2:

代码语言:javascript
复制
输入: 5
输出: [0,1,1,2,1,2]

解法

此题是 LeetCode 191 Number of 1 Bits 的拓展版, 可以利用那道题的两种算法, 只不过套个循环, 时间和空间复杂度都是 O(n).

那两种解法就不说了. 这里说下另一种解法.

这里分为 2 的倍数非 2 的倍数 两种数.

他们有一个区别就是二进制的最低位是否为 1.

2 的倍数其二进制最低位都是 0. 非 2 的倍数其二进制最低位都是 1.

除 2 或右移一位后, 等于是去掉最低位, 那么既然 2 的倍数最后一位都是 0, 所以对于 2 的倍数 除 2 或右移一位后, 数字 1 的个数并不会变.

那么对于非 2 的倍数 n, n 肯定比 n - 1 的二进制中 1 的个数多一位. 如 n = 1111, n - 1 = 1110.

代码语言:javascript
复制
class Solution {
    public int[] countBits(int num) {
        int[] arr = new int[num + 1];
        for (int i = 0; i <= num; i++) {
            if (i % 2 == 0) {
                arr[i] = arr[i >> 1];
            } else {
                arr[i] = arr[i - 1] + 1;
            }
        }
        return arr;
    }
}

时间复杂度 O(n), 空间复杂度 O(n).

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 比特位计数
    • 题意
      • 解法
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档