Leetcode--338. 比特位计数
发布日期:2021-04-30 21:02:26 浏览次数:101 分类:精选文章

本文共 1079 字,大约阅读时间需要 3 分钟。

为了解决这个问题,我们需要计算给定范围内每个数字的二进制表示中1的数量。通过动态规划,我们可以在O(n)的时间复杂度内完成这个任务,同时保持空间复杂度为O(n)。

方法思路

我们可以利用动态规划来解决这个问题。对于每个数字i:

  • 如果i是奇数,那么i的二进制表示比i-1多一个1,因此1的数量等于i-1的1的数量加1。
  • 如果i是偶数,那么i的二进制表示最后一个是0,去掉这个0后,剩下的部分就是i/2的二进制表示,因此1的数量等于i/2的1的数量。
  • 这种方法的时间复杂度为O(n),因为我们只需要遍历每个数字一次。空间复杂度为O(n),因为我们使用了一个大小为n+1的数组来存储中间结果。

    解决代码

    public class Solution338 {    public static int[] countBits(int num) {        int[] dp = new int[num + 1];        dp[0] = 0;        for (int i = 1; i <= num; i++) {            if (i % 2 == 1) {                dp[i] = dp[i - 1] + 1;            } else {                dp[i] = dp[i / 2];            }        }        return dp;    }    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int x = sc.nextInt();        int[] dp = countBits(x);        for (int i = 0; i <= x; i++) {            System.out.print(dp[i] + " ");        }    }}

    代码解释

  • 初始化数组:我们创建了一个大小为num+1的数组dp,用于存储每个数字的1的数量。
  • 递推关系:遍历每个数字i,从1到num:
    • 如果i是奇数,dp[i] = dp[i-1] + 1。
    • 如果i是偶数,dp[i] = dp[i/2]。
  • 输出结果:读取输入的数字,调用countBits方法计算结果,并输出每个数字的1的数量。
  • 这种方法高效且直接,能够在O(n)的时间内完成任务,同时保持了较低的空间复杂度。

    上一篇:2017年网易校招题 输入一个数将其变为斐波那契数(最小步数)
    下一篇:【剑指offer】面试题55 - I. 二叉树的深度(java)

    发表评论

    最新留言

    很好
    [***.229.124.182]2026年05月31日 17时01分08秒