首页 > 其他分享 >LeetCode 338.比特位计数(简单)

LeetCode 338.比特位计数(简单)

时间:2022-11-25 13:31:29浏览次数:53  
标签:338 比特 二进制 个数 偶数 -- int LeetCode dp

题目描述:

给你一个整数 ​​n​​​ ,对于 ​​0 <= i <= n​​​ 中的每个 ​​i​​​ ,计算其二进制表示中 ​​1​​​ 的个数 ,返回一个长度为 ​​n + 1​​​ 的数组 ​​ans​​ 作为答案。

示例 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 <=

进阶:

  • 很容易就能实现时间复杂度为 ​​O(n log n)​​ 的解决方案,你可以在线性时间复杂度 ​​O(n)​​ 内用一趟扫描解决此问题吗?
  • 你能不使用任何内置函数解决此问题吗?(如,C++ 中的 ​​__builtin_popcount​​ )

题目分析:

这道题可以利用动态规划和位运算进行快速的求解。首先,对于所有的数字,可以分为奇数和偶数两类,在二进制中,我们很容易知道对应一个奇数,肯定比这个奇数之前的那个偶数多一个 ​​1​​​ ,也就是多了二进制表示中最低位的那个 ​​1​​​ 。例如, ​​3​​​ 的二进制为 ​​11​​​ , ​​3 - 1 = 2​​​ , ​​2​​​ 的二进制表示法中 ​​1​​​ 的个数为 ​​1​​​ ,再加上 ​​1​​​ 刚好就是 ​​2​​​ ,即 ​​3​​​ 的二进制表示法中 ​​1​​​ 的个数为 ​​2​​ 。

十进制

二进制

十进制

二进制

0

0

1

1

2

10

3

11

而对于偶数来说,二进制表示中,偶数中 ​​1​​​ 的个数与当前这个数舍弃最低一位后得到的数中的 ​​1​​​ 的个数相同。例如, ​​4​​​ 的二进制表示为 ​​100​​​ ,舍弃掉最后一位变为 ​​10​​​ ,对应的十进制值为 ​​2​​​ , ​​2​​​ 的二进制表示法中 ​​1​​​ 的个数为 ​​1​​​ ,则对于 ​​4​​​ 的二进制表示法中 ​​1​​​ 的个数也为 ​​1​​ 。

十进制

二进制

十进制

二进制

0

0

1

1

2

10

3

11

4

100

5

101

6

110

7

111

我们先定义一个结果数组,其中索引 ​​i​​​ 上的值表示数字 ​​i​​​ 的二进制含有 ​​1​​​ 的个数。对于第 ​​i​​​ 个数字,如果它二进制的最后一位为 ​​1​​​ ,即它为奇数,那么它含有 ​​1​​​ 的个数为索引 ​​i-1​​​ 上的值加上 ​​1​​​ ;如果它二进制的最后一位为 ​​0​​​ ,即它为偶数,那么它含有 ​​1​​​ 的个数和其算术右移结果相同,即与索引 ​​i>>1​​ 上的值相同。

题解:

执行用时: 1 ms

内存消耗: 42 MB

class Solution {
public int[] countBits(int n) {
// 结果数组
int[] dp = new int[n + 1];
// 循环每个数
for (int i = 1; i <= n; ++i) {
// 如果当前数 i 和 1 按位与结果为 0
// 则 i 为偶数
if ((i & 1) == 0) {
// 1 的个数为 i 舍弃最后一位对应的数的 1 的个数
dp[i] = dp[i >> 1];
} else {
// 否则为奇数
// 1 的个数为 i - 1 对应的数的 1 的个数值加 1
dp[i] = dp[i - 1] + 1;
}
}
// 返回结果集
return dp;
}
}

题目来源:力扣(LeetCode)



标签:338,比特,二进制,个数,偶数,--,int,LeetCode,dp
From: https://blog.51cto.com/u_15891283/5886580

相关文章

  • LeetCode 540.有序数组中的单一元素
    LeetCode540.有序数组中的单一元素题目链接:​​https://leetcode-cn.com/problems/single-element-in-a-sorted-array/​​题目描述:给定一个只包含整数的有序数组,每个元......
  • LeetCode 154.寻找旋转排序数组中的最小值II
    LeetCode154.寻找旋转排序数组中的最小值II题目链接:​​https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/​​题目描述:已知一个长度为 n ......
  • LeetCode 81.搜索旋转排序数组II
    LeetCode81.搜索旋转排序数组II题目链接:​​https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/​​题目描述:已知存在一个按非降序排列的整数数组 n......
  • LeetCode 34.在排序数组中查找元素的第一个和最后一个位置
    LeetCode34.在排序数组中查找元素的第一个和最后一个位置题目链接:​​https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/​​......
  • LeetCode 76.最小覆盖子串
    LeetCode76.最小覆盖子串题目链接:​​https://leetcode-cn.com/problems/minimum-window-substring/​​题目描述:给你一个字符串 s 、一个字符串 t 。返回 s 中涵......
  • leetcode 104. 二叉树的最大深度 js实现
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null......
  • leetcode 344. 反转字符串 js实现
    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解......
  • leetcode 21. 合并两个有序链表 js实现
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示......
  • leetcode_Day2_35搜索插入位置
    1.题目  2.解一 主要思路:二分法,不多赘述,为题目所给标准解法。3.解二   主要思路:循环对比,自己想的,感觉写的非常冗余,内存占用和速度都很大。不过没学过算法,......
  • leetcode 19. 删除链表的倒数第 N 个结点 js实现
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:......