leetcode刷题68.前 n 个数字二进制中 1 的个数 ——Java版
Posted 一条coding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题68.前 n 个数字二进制中 1 的个数 ——Java版相关的知识,希望对你有一定的参考价值。
⭐欢迎订阅《leetcode》专栏,每日一题,每天进步⭐
如果最后一位为0,则下一个数字的1个数会+1
如果最后一位为1,下一个数字会导致最后一位变成0,进一位,相当于右移一位之后+1的数字中1的个数
——leetcode此题热评
前言
哈喽,大家好,我是一条。
糊涂算法,难得糊涂
点击跳转到《糊涂算法》专栏学习java大厂面试必备数据结构和算法知识!
Question
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
难度:简单
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
示例 1:
输入: n = 2 输出: [0,1,1] 解释: 0 --> 0 1 --> 1 2 --> 10
示例 2:
输入: n = 5 输出: [0,1,1,2,1,2] 解释: 0 --> 0 1 --> 1 2 --> 10 3 --> 11 4 --> 100 5 --> 101
说明 :
0 <= n <= 105
Solution
通过位运算找到规律,在用动态规划的思想递推计算。
Code
所有
leetcode
代码已同步至github欢迎
star
/**
* @author 一条coding
*/
class Solution {
public int[] countBits(int n) {
int[] dp = new int[n + 1];
dp[0] = 0;
for (int i = 1; i <= n; i++){
// 奇数时,二进制表示中,奇数一定比前面那个偶数多一个 1
if (i % 2 == 1){
dp[i] = dp[i - 1] + 1;
}
// 偶数时,它的二进制1的位数与i/2 的二进制1的位数相等;
// 偶数的二进制末尾是 0,右移一位等于i/2,且1的个数不会变,故使用位运算i>>1当作i/2
else{
dp[i] = dp[i >> 1];
}
}
return dp;
}
}
Result
复杂度分析
- 时间复杂度:O(N)
🌈寻宝
⭐今天是坚持刷题更文的第68/100天
⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力
⭐更多数据结构和算法讲解欢迎关注专栏《糊涂算法》
为了回馈各位粉丝,礼尚往来,给大家准备了一些学习资料
需要的小伙伴可以点「下方卡片👇👇👇关注后回复「算法」领取
以上是关于leetcode刷题68.前 n 个数字二进制中 1 的个数 ——Java版的主要内容,如果未能解决你的问题,请参考以下文章