首页 > 其他分享 >LeetCode 2275: 按位与结果大于零的最长组合题解

LeetCode 2275: 按位与结果大于零的最长组合题解

时间:2025-01-12 23:54:55浏览次数:1  
标签:2275 运算 int 题解 二进制位 num 按位 bit

LeetCode 2275: 按位与结果大于零的最长组合题解

1. 题目分析

这道题目考察了位运算的基本概念和应用。我们需要在给定的数组中找出最长的子序列,使得这些数字进行按位与运算后的结果大于0。

1.1 关键概念

  • 按位与运算 (&)

    • 两个二进制位都为1时,结果为1。
    • 只要有一个为0,结果就为0。
    • 多个数字按位与时,某一位只要出现一个0,最终结果该位就是0。

2. 解题思路

2.1 核心思想

要使得按位与的结果大于0,意味着结果中至少有一位是1。反过来思考:

  • 如果一组数字按位与结果大于0,那么这组数字必然在某个二进制位上都是1。

2.2 算法步骤

  1. 遍历每一个二进制位(0-31位)。
  2. 对于每一位,统计数组中有多少个数字在这一位上是1。
  3. 所有位置中,出现1最多的那个位置的计数就是我们要的答案。

3. 代码实现

class Solution {
public:
    int largestCombination(vector<int>& candidates) {
        int result = 0;
        // 遍历32位
        for (int bit = 0; bit < 32; bit++) {
            int count = 0;
            // 统计在当前位上为1的数字个数
            for (int num : candidates) {
                if ((num >> bit) & 1) {
                    count++;
                }
            }
            result = max(result, count);
        }
        return result;
    }
};

4. 代码详解

4.1 位运算技巧

  • num >> bit:将 num 右移 bit 位。

    • 例如:12 >> 2 = 3 (1100 -> 0011)
  • & 1:与1进行按位与运算。

    • 用于检查最右边的位是否为1。
    • 例如:3 & 1 = 1 (0011 & 0001 = 0001)

4.2 时间复杂度分析

  • 外层循环:32次(固定次数)
  • 内层循环:n次(n为数组长度)
  • 总时间复杂度:O(32 * n) = O(n)

4.3 空间复杂度分析

  • 只使用了常数个变量
  • 空间复杂度:O(1)

5. 相关知识点扩展

5.1 常见的位运算操作

  • 获取第 k 位:(num >> k) & 1
  • 设置第 k 位为1:num |= (1 << k)
  • 设置第 k 位为0:num &= ~(1 << k)
  • 判断是否是2的幂:(n & (n-1)) == 0

5.2 位运算的应用场景

  • 状态压缩
  • 权限管理
  • 标志位操作
  • 优化空间使用

6. 总结

这道题目是位运算的经典应用:

  • 利用了按位与运算的特性
  • 通过逆向思维简化问题
  • 展示了如何高效处理二进制位的统计问题掌握这类问题对于理解计算机底层运算和优化算法都有很大帮助。

标签:2275,运算,int,题解,二进制位,num,按位,bit
From: https://www.cnblogs.com/tan-ke/p/18667639

相关文章

  • 【大数据】beeline 导出文件有特殊字符的问题解决
    问题近期在做大数据查询引擎导出文件的功能,使用了hive的beeline客户端。发现beeline导出的文件以及终端输出有许多特殊字符。按照官方文档使用beeline导出命令:[1]/usr/bin/beeline--silent=true--showHeader=true--outputformat=csv2-fquery.hql</dev/null>/tm......
  • Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]
    Cut:AC自动机简单题。思路看见多个模式串以及求前缀,很显然能想到构建一个AC自动机。那么在用\(T\)查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树insert的时候就能求出来。求出每一位的最长前缀后,因为这些部分都不能作为分割点,所以将这些区域用差分......
  • 验证出栈顺序是否正确题解&队列
    (1)验证出栈顺序是否正确队列遵循先入后出的原则,故需要一个数组来模拟记录入栈和出栈再分别对出栈顺序进行遍历验证是否正确#include<iostream>usingnamespacestd;#definem100000intb[m],a[m],c[m];intmain(){ intt; cin>>t; while(t--){ intn;......
  • THUWC 2020 Day3 题解
    Cache一致性协议按照学习手册最后的模拟。\(\text{Exclusive}/\text{Shared}\)只有编号最小的返回,但都要改变状态。\(\text{Modified}\)的所有的都要返回且改变状态。Cache替换算法这里说一下\(\text{PLRU}\)算法。对于每次,先找是否命中。如果是否,就在二叉搜索树上......
  • 2021 年 3 月青少年软编等考 C 语言五级真题解析
    目录T1.红与黑思路分析T2.密室逃脱思路分析T3.求逆序对数思路分析T4.最小新整数思路分析T1.红与黑有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计......
  • Codeforces Round 734 (Div. 3) 题解
    建议开题顺序:A,B1,B2,C,E,F,D1,D2。A.PolycarpandCoins记\(k=\min(c1,c2)\),则\((c1-k)\times1+(c2-k)\times2+k\times3=n\)。注意到\(n\mod3\)为\(0,1,2\)。所以我们\(|c1-c2|\)最多为\(1\),只需要将\(n\mod3\)给\(1\)或\(2\)即可。B1.WonderfulColo......
  • P5025 [SNOI2017] 炸弹 题解
    题意link.题解我们充分发扬人类智慧。考虑到可能连锁爆炸,我们不能通过一个单纯的二分来解决问题。考虑\(dp\)。记\(f(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标小于它的点。\(g(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标大于它的点。我们以\(f\)为例,\(g\)......
  • AT_abc388_f Dangerous Sugoroku 题解
    太幽默了。显然可以用矩阵快速幂解决,矩阵里维护距离当前点\(B\)以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度\(O(B^3m\logn)\)。然后你就T了。此时你很急,你现在应该快点卡常来AK这场比赛而不是研究其他的做法,于是我们发现快速幂......
  • 2025/1/12 力扣每日一题(2275.按位与结果大于零的最长组合)
    来源:力扣(LeetCode)链接:https://leetcode.cn/problems/largest-combination-with-bitwise-and-greater-than-zero/description/?envType=daily-question&envId=2025-01-12题目:对数组nums执行按位与相当于对数组nums中的所有整数执行按位与。例如,对nums=[1,5,3]来......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......