首页 > 其他分享 >982. 按位与为零的三元组

982. 按位与为零的三元组

时间:2023-04-08 18:44:14浏览次数:47  
标签:nums 982 复杂度 三元组 int 枚举 按位

题目链接:982. 按位与为零的三元组

方法一:枚举(超时)

解题思路

直接枚举\(i, j, k\)分别取\([0, n-1]\),判断\((\)\(nums[i]\) & \(nums[j]\) & \(nums[k]\)\()\) \(==\) \(0\)。由于本题的数量级较大 \(n = 1000\),\(n^3 = 10^9\),会导致暴力枚举超时。
注意:\(==\) 的优先级大于 \(&\),所以对于 \(&\) 运算要加\(()\)。

代码

class Solution {
public:
    int countTriplets(vector<int>& nums) {
        int cnt[ 1 << 16 ]{};
        cnt[0] = nums.size();
        for (auto m : nums) {
            m ^= 0xffff;
            for (int s = m; s ; s = (s - 1) & m) {
                cnt[s] ++ ;
            }
        }
        int ans = 0;
        for (auto x : nums) {
            for (auto y : nums) {
                ans += cnt[x & y];
            }
        }
        return ans;
    }
};

方法二:枚举 + 预处理

解题思路

对于\(nums[i]\) & \(nums[j]\)的值\(y\)进行计数,然后\(nums[k]\)再与\(y\)进行与运算。

代码

class Solution {
public:
    int countTriplets(vector<int>& nums) {
        int cnt[ 1 << 16 ]{};
        for (auto i : nums) {
            for (auto j : nums)
            cnt[i ^ j] ++ ;
        }
        int ans = 0;
        for (auto x : nums) {
            for (int y = 0; y < 1 << 16; y ++ ) {
                if ((x & y) == 0) ans += cnt[y];
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n(n + U)),n = nums.length()\);
空间复杂度:\(O(m),m = max(nums)\)。

方法三:枚举 + 子集优化

解题思路

参考—灵茶山艾府:有技巧的枚举 + 常数优化(Python/Java/C++/Go)

代码

class Solution {
public:
    int countTriplets(vector<int>& nums) {
        int cnt[ 1 << 16 ]{};
        cnt[0] = nums.size();
        for (auto m : nums) {
            m ^= 0xffff;
            for (int s = m; s ; s = (s - 1) & m) {
                cnt[s] ++ ;
            }
        }
        int ans = 0;
        for (auto x : nums) {
            for (auto y : nums) {
                ans += cnt[x & y];
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n(n + U)),n = nums.length()\);
空间复杂度:\(O(m),m = max(nums)\)。

标签:nums,982,复杂度,三元组,int,枚举,按位
From: https://www.cnblogs.com/lxycoding/p/17298991.html

相关文章

  • 2022-适用于 Windows 10 Version 1809 的 02 累积更新,适合基于 x64 的系统 (KB5010351
    2022-适用于Windows10Version1809的02累积更新,适合基于x64的系统(KB5010351)-错误0x800f0982系统是win10企业版LTSC版本可能安装的是精简版导致的运行疑难解答这个方案无效利用win10更新助手-因为是企业版TLSC版本所以用不了WIN10LTSC版更新失败如何解决?这......
  • 算术三元组的数目
    给你一个下标从0开始、严格递增的整数数组nums和一个正整数diff。如果满足下述全部条件,则三元组(i,j,k)就是一个算术三元组:i<j<k,nums[j]-nums[i]==diff且nums[k]-nums[j]==diff返回不同算术三元组的数目。示例1:输入:nums=[0,1,4,6,7,10],......
  • 递增三元组
    此题考查暴力,二分此题未AC用了两种方法解题dfsbinarySearchdfspackagelanqiao;importjava.util.Scanner;publicclassN172{staticint[][]m;......
  • 递增三元组
    递增三元组[蓝桥杯2018省B]递增三元组题目描述给定三个整数数组\(A=[A_1,A_2,\cdots,A_N]\),\(B=[B_1,B_2,\cdots,B_N]\),\(C=[C_1,C_2,\cdots,C_N]\)。......
  • 按位运算符
    按位运算符指定a=60(00111100);b=13(00001101)按位与(&)对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1,如下图:(a&b)结......
  • 201.数字范围按位与
    数字范围按位与给你两个整数left和right,表示区间[left,right],返回此区间内所有数字按位与的结果(包含left、right端点)。示例1:输入:left=5,right=7输......
  • 变量交换方法(使用按位异或操作符)
    按位异或操作符:^作用:一个整形在计算机中按二进制存储,按位异或即按二进制位将两个数对比,相同为0,相反为1;举例如下:1#include<stdio.h>23intmain()4{5......
  • 982. 按位与为零的三元组 (Hard)
    问题描述982.按位与为零的三元组(Hard)给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:0......
  • 982. 安位与为 0 的三元组
    题目链接: 982.按位与为零的三元组-力扣(LeetCode)    按位与为零的三元组-按位与为零的三元组-力扣(LeetCode) ......
  • 力扣---982. 按位与为零的三元组
    给你一个整数数组nums,返回其中按位与三元组的数目。按位与三元组是由下标(i,j,k)组成的三元组,并满足下述全部条件:   0<=i<nums.length   0<=j<nu......