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 的个数也是非常基础且高效的技巧

相关推荐
lueluelue472 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水1684 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子5 小时前
Adaboost算法原理与计算实例
算法
别怪我很水5 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚8 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机8 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*8 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木9 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
alexwang2119 小时前
HDU 4348 详细题解
c++·算法·题解·hdu·主席树·可持久化数据结构·可持久化线段树