【教3妹学算法-每日3题(1)】 按位与为零的三元组

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
坚持不懈,越努力越幸运,大家一起学习鸭~~~

3妹

3妹:早啊, 2哥
2哥:3妹今天怎么这么开心
3妹:因为今天是周五啊, 每个周五我都会很开心, 因为明后天就不用上班了呀。
2哥:晚上去看电影怎么样。
3妹:可以的, 看喜剧片吗?
2哥:我无所谓, 哪怕不看喜剧片,想到明天不用上班,也能看出喜剧片的效果,哈哈。
3妹:ok, 晚上见, 我要去上班啦。
2哥:别忘记通勤路上看看算法题,不能偷懒哈。

讲课

题目:

给你一个整数数组 nums ,返回其中 按位与三元组 的数目。

按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:

0 <= i < nums.length
0 <= j < nums.length
0 <= k < nums.length
nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。

示例 1:

输入:nums = [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
示例 2:

输入:nums = [0,0,0]
输出:27

提示:

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

java代码:

class Solution {
    public int countTriplets(int[] nums) {
        int count = 0;
        int maxNum = 0;
        for (int num : nums) {
            maxNum = Math.max(maxNum, num);
        }
        int[] map = new int[maxNum + 1];
        for (int num1 : nums) {
            for (int num2 : nums) {
                map[num1 & num2]++;
            }
        }
        for (int i = 0; i <= maxNum; i++) {
            if (map[i] != 0) {
                for (int num : nums) {
                    if ((i & num) == 0) {
                        count += map[i];
                    }
                }
            }
        }
        return count;
    }
}

你可能感兴趣的:(【教3妹学算法-每日3题(1)】 按位与为零的三元组)