题目描述:题目链接

对于求解一个十进制数转化为二进制时里面1的个数,可以先看一下概况:

十进制数        二进制数        1的个数

  1            1             1

  2            10           1

  3            11            2

  4            100          1

  5            101           2

  6            110            2

  7            111            3

看上面的一系列数字的二进制中1的个数:

对于一个偶数 n ;其二进制组成最低位为0,所以其1的位数就是除了最低位之外前面那一部分中1的位数,即是i/21的位数。

对于一个奇数n,其末位的数一定是1,那么对于n-1,一定是个偶数,并且只需要将n-1的末位0改成1就可以变成 n,因为   a[n] = a[n - 1] +1;

则可以得出上面两个递推关系式。

按照动态规划的思路:

1:问题归纳:用数组a[ i ] 表示 i 的二进制中1的个数。

2:递推关系式    a[n] = a[n/2]           n为偶数

          a[n] = a[n-1] +1       n为奇数

3:初始化:a[0] = 0

下面给出代码:

class Solution {
public int[] countBits(int num) {
int[] res = new int[num+1];
res[0] = 0;
//先将所有的num转化为偶数处理,因为没有都是处理两个数
int n = num%2 !=0 ? num-1:num;
for(int i = 1; i <= n;i++){
res[i] = res[i-1]+1;
i++;
res[i] = res[i/2];
}
//最后有个奇数没有处理
if(num % 2 != 0){
res[num] = res[n] + 1;
}
return res;
}
}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

方法2:

对于一个数n,求解其二进制中1的个数可以利用位运算。

给出递推关系式:a[i] = a[i&i-1]+1;   这个关系式可以有上面的实例归纳出来。

class Solution {
public int[] countBits(int num) {
int[] a = new int[num+1];
for(int i =1;i <= num;i++){
a[i] = a[i&i-1]+1;
}
return a;
}
}

Leetcode——338. 比特位计数的更多相关文章

  1. LeetCode 338. 比特位计数

    338. 比特位计数 题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 示例 1: 输入: 2 输出 ...

  2. Java实现 LeetCode 338 比特位计数

    338. 比特位计数 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1 ...

  3. Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits)

    Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits) 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数 ...

  4. leetcode TOP100 比特位计数

    338. 比特位计数 题目描述: `给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: ...

  5. 338.比特位计数( Counting Bits)leetcode

    附上:题目地址:https://leetcode-cn.com/problems/counting-bits/submissions/ 1:题目: 给定一个非负整数 num.对于 0 ≤ i ≤ nu ...

  6. Leetcode题目338:比特位计数(中等)

    题目描述: 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例  ...

  7. [Leetcode] 第338题 比特位计数

    一.题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例 ...

  8. 338. Counting Bits_比特位计数_简单动态规划

    https://leetcode.com/problems/counting-bits/ 这是初步了解动态规划后做的第一道题,体验还不错... 看完题目要求后,写出前10个数的二进制数,发现了以下规律 ...

  9. 【Leetcode】338. Bit位计数

    每次刷leetcode都有一种发现新大陆的感觉. 题目链接:https://leetcode-cn.com/problems/counting-bits/description/ 给定一个非负整数 n ...

随机推荐

  1. HDU1203(01背包)

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. python学习之老男孩python全栈第九期_day015作业_老男孩Python全9期练习题(面试真题模拟)

    一. 选择题(32分) 1. python不支持的数据类型有:AA. charB. intC. floatD. list 2. Ex = ‘foo’y = 2print(x + y)A. fooB. ...

  3. avalonjs 中的if else实现的几种方法

    在学习avalonjs的过程中,发现模板中并没有if else这样的写法,不像tempalte ejs这些,所以总结了三种方法来实现,仅供在使用avalonjs的同学参考,主要是通过ms-if 表达式 ...

  4. SD从零开始41-44

    [原创] SD从零开始41 科目确定(Account determination) 使用科目确定Using Account Determination 你将需要在几个不同的领域确定将要记账的科目: 用 ...

  5. SQLServer 2005客户端远程连接sql2008 数据库服务器

    SQL2005客户端远程连接sql2008 数据库服务器 by:授客 QQ:1033553122 准备工作: 客户端所在pc机配置: 配置数据源 控制面板-管理工具-ODBC数据源-系统DSN-添加- ...

  6. Android工程中javax annotation Nullable找不到的替代方案

    我们在某些Android开源库中会遇到下面的引用找不到的问题:import javax.annotation.Nonnull;import javax.annotation.Nullable; 其实A ...

  7. Android性能优化系列之APK终极瘦身策略

    第1条:使用一套资源 这是最基本的一条规则,但非常重要. 对于绝大对数APP来说,只需要取一套设计图就足够了.鉴于现在分辨率的趋势,建议取720p的资源,放到xhdpi目录. 相对于多套资源,只使用7 ...

  8. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?

    [编者按]本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文. 这是一篇讲述将大块 Pyth ...

  9. Oracle EBS OPM convert dtl reservation

    --convert_dtl_reservation --created by jenrry DECLARE l_reservation_rec mtl_reservations%ROWTYPE; l_ ...

  10. 使用Doxygen生成C#帮助文档

    一. 什么是Doxygen? Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件.通常我们在写程序时,或多或少都会写上批注,但是对于其它人而言,要直接探索程序里的批注,与打 ...