美文网首页
LeetCode #982 Triples with Bitwi

LeetCode #982 Triples with Bitwi

作者: air_melt | 来源:发表于2022-01-09 23:20 被阅读0次

982 Triples with Bitwise AND Equal To Zero 按位与为零的三元组

Description:
Given an integer array nums, return the number of AND triples.

An AND triple is a triple of indices (i, j, k) such that:

0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0, where & represents the bitwise-AND operator.

Example:

Example 1:

Input: nums = [2,1,3]
Output: 12
Explanation: We could choose the following i, j, k triples:
(i=0, j=0, k=1) : 2 & 2 & 1
(i=0, j=1, k=0) : 2 & 1 & 2
(i=0, j=1, k=1) : 2 & 1 & 1
(i=0, j=1, k=2) : 2 & 1 & 3
(i=0, j=2, k=1) : 2 & 3 & 1
(i=1, j=0, k=0) : 1 & 2 & 2
(i=1, j=0, k=1) : 1 & 2 & 1
(i=1, j=0, k=2) : 1 & 2 & 3
(i=1, j=1, k=0) : 1 & 1 & 2
(i=1, j=2, k=0) : 1 & 3 & 2
(i=2, j=0, k=1) : 3 & 2 & 1
(i=2, j=1, k=0) : 3 & 1 & 2

Example 2:

Input: nums = [0,0,0]
Output: 27

Constraints:

1 <= nums.length <= 1000
0 <= nums[i] < 2^16

题目描述:
给定一个整数数组 A,找出索引为 (i, j, k) 的三元组,使得:

0 <= i < A.length
0 <= j < A.length
0 <= k < A.length
A[i] & A[j] & A[k] == 0,其中 & 表示按位与(AND)操作符。

示例 :

输入:[2,1,3]
输出:12
解释:我们可以选出如下 i, j, k 三元组:
(i=0, j=0, k=1) : 2 & 2 & 1
(i=0, j=1, k=0) : 2 & 1 & 2
(i=0, j=1, k=1) : 2 & 1 & 1
(i=0, j=1, k=2) : 2 & 1 & 3
(i=0, j=2, k=1) : 2 & 3 & 1
(i=1, j=0, k=0) : 1 & 2 & 2
(i=1, j=0, k=1) : 1 & 2 & 1
(i=1, j=0, k=2) : 1 & 2 & 3
(i=1, j=1, k=0) : 1 & 1 & 2
(i=1, j=2, k=0) : 1 & 3 & 2
(i=2, j=0, k=1) : 3 & 2 & 1
(i=2, j=1, k=0) : 3 & 1 & 2

提示:

1 <= A.length <= 1000
0 <= A[i] < 2^16

思路:

状态压缩
用一个 count 数组记录两个数与的结果
然后查询能够和当前数字与的结果为 0 的 count 中的对应值
每次消除最后一位 x = (x - 1) & x
注意需要将本身是 0 的也加上
时间复杂度为 O(n ^ 2), 空间复杂度为 O(m), m 为 max(nums)

代码:
C++:

class Solution
{
public:
    int countTriplets(vector<int>& nums) 
    {
        int max_value = 1 << 16, n = nums.size(), result = 0;
        vector<int> count(max_value);
        for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) ++count[nums[i] & nums[j]];
        for (int i = 0; i < n; i++) for (int cur = max_value - 1 - nums[i], j = cur; j > 0; j = (j - 1) & cur) result += count[j];
        for (int i = 0; i < n; i++) result += count.front();
        return result;
    }
};

Java:

class Solution {
    public int countTriplets(int[] nums) {
        int maxValue = 1 << 16, n = nums.length, result = 0, count[] = new int[maxValue];
        for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) ++count[nums[i] & nums[j]];
        for (int i = 0; i < n; i++) for (int cur = maxValue - 1 - nums[i], j = cur; j > 0; j = (j - 1) & cur) result += count[j];
        for (int i = 0; i < n; i++) result += count[0];
        return result;
    }
}

Python:

class Solution:
    def countTriplets(self, nums: List[int]) -> int:
        result, n, max_value = 0, len(nums), 1 << 16
        count = Counter([nums[i] & nums[j] for i in range(n) for j in range(n)])
        for i in range(n):
            cur = j = max_value - 1 - nums[i]
            result += count[0]
            while j > 0:
                result += count[j]
                j = (j - 1) & cur
        return result

相关文章

  • LeetCode #982 Triples with Bitwi

    982 Triples with Bitwise AND Equal To Zero 按位与为零的三元组 Desc...

  • python马丁challenge10.Finding part

    Write a program triples_2.py that finds all triples of co...

  • python马丁challenge9.Finding parti

    Insert your code into triples_1.py so as to find all trip...

  • 982

    有知道京东刷单软件的吗?

  • 982

    6月2日,农历五月初四, 周四,躲雨 明天端午节,晚上我给丫头发了两百块红包,给她明天过节。 晚上,咱四个同事一起...

  • 云安-终篇

    一 公元982年(北宋),穆科寨 ...

  • 幸福成功日记2022-06-18(第十六天)

    没有记录就没有发生没有 反思的人生不值得过 连续早起天数:982天打卡 累计天数:6/90/982 日期: 202...

  • 亲子(982)

    2019.12.8 星期日 晴 今天周末,爷俩醒的一如往常的早,俺们娘俩开启周末懒床模式,七点半才起。真搞...

  • 982:随记

    有些生气。昨晚写了一篇《三十年河东,三十年河西》,说的是有关计划生育和鼓励生育的问题,既没有说相关的坏话,又没有嘲...

  • 敬畏~982

    生在天地间,行在红尘中,要心存敬畏。 立身之道何穷,只得一敬字,便事事皆整。 为人处世只要处处存有敬意便理顺所有的...

网友评论

      本文标题:LeetCode #982 Triples with Bitwi

      本文链接:https://www.haomeiwen.com/subject/kmwucrtx.html