LeetCode 762 二进制表示中质数个计算置位

LeetCode 762 二进制表示中质数个计算置位

题目描述

给定两个整数 LR,找到闭区间 [L, R] 范围内,计算置位位数为质数 的整数个数。

(计算置位位数:二进制表示中 1 的个数)

示例:

复制代码
输入: L = 6, R = 10
输出: 4
解释:
6  (110) -> 2 个 1,2 是质数
7  (111) -> 3 个 1,3 是质数
8 (1000) -> 1 个 1,1 不是质数
9 (1001) -> 2 个 1,2 是质数
10(1010) -> 2 个 1,2 是质数
共计 4 个。

解题思路

题目核心有两个步骤:

  1. 对区间内每个数,统计其二进制中 1 的个数。
  2. 判断该个数是否为质数。

关键点分析

  • 二进制 1 的个数可以通过位运算快速得到:不断右移并检查最低位。
  • 质数判断:由于本题数据范围 L, R <= 10^6,二进制最多有 20 位(2^20 = 1048576),因此 1 的个数最多为 20。我们可以预先将 20 以内的所有质数列出(2, 3, 5, 7, 11, 13, 17, 19),直接查表即可,无需每次判断质数。

代码实现(C++)

cpp 复制代码
class Solution {
public:
    int countPrimeSetBits(int left, int right) {
        unordered_set<int> primes{2, 3, 5, 7, 11, 13, 17, 19}; // 20 以内的所有质数
        int res = 0;
        for (int i = left; i <= right; ++i) {
            int s = 0;
            // 计算 i 的二进制中 1 的个数
            for (int j = i; j; j >>= 1) s += j & 1;
            res += primes.count(s);
        }
        return res;
    }
};

代码解释

  1. 质数集合
    unordered_set<int> primes{2,3,5,7,11,13,17,19};

    因为最大可能置位位数不超过 20,所以预先存储 20 以内的质数,用于 O(1) 判断。

  2. 遍历区间
    for (int i = left; i <= right; ++i) 枚举区间内每个数。

  3. 计算置位位数

    内层循环 for (int j = i; j; j >>= 1)j 不断右移,直到 j 变为 0。
    s += j & 1 每次取最低位(0 或 1)累加到 s 中,最终 s 即为二进制中 1 的个数。

  4. 结果累加
    if (primes.count(s)) ++res;s 是质数,则答案加 1。

复杂度分析

  • 时间复杂度 :区间长度为 n = right - left + 1,每个数需要循环其二进制位数,最多 20 次,因此总时间复杂度为 O(n * 20),即线性时间。
  • 空间复杂度:仅使用了常数大小的额外空间(质数集合)。

总结

本题巧妙之处在于数据范围决定了置位位数有限,因此可以预先列出质数,避免了动态判断质数的开销。位运算统计 1 的个数也是非常基础且高效的技巧

相关推荐
阿Y加油吧7 分钟前
算法二刷复盘:LeetCode 79 单词搜索 & 131 分割回文串(Java 回溯精讲)
java·算法·leetcode
徐新帅8 分钟前
4164:【GESP2512七级】学习⼩组
算法
6Hzlia11 分钟前
【Hot 100 刷题计划】 LeetCode 101. 对称二叉树 | C++ DFS 极简递归模板
c++·leetcode·深度优先
北顾笙98017 分钟前
day30-数据结构力扣
数据结构·算法·leetcode
爱写代码的倒霉蛋18 分钟前
天梯赛经验总结(细节篇)
经验分享·算法
Hello!!!!!!30 分钟前
C++基础(五)——屏幕和文件输入输出
开发语言·c++·算法
Rnan-prince40 分钟前
Count-Min Sketch:海量数据频率统计的“轻量级计数器“
python·算法
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:加工生产调度
c++·算法·贪心·csp·信奥赛·排序贪心·加工生产调度
三毛的二哥1 小时前
BEV:MapTR
人工智能·算法·计算机视觉·3d
小菜鸡桃蛋狗1 小时前
C++——vector
开发语言·c++·算法