首页 > 编程语言 >每日算法 230304

每日算法 230304

时间:2023-03-04 22:01:16浏览次数:43  
标签:nums int 每日 三元组 运算符 ++ 算法 按位 230304

每日算法 230304

题目

982. 按位与为零的三元组

给你一个整数数组 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

来源:力扣(LeetCode)

思路

因为nums[i]在1到2^16之间,按照2进制来说最大为16位。题目要求是nums[i] & nums[j] & nums[k] == 0,只要三个数的所有相同位上都至少有1个0,那么要求就成立。那么就是如何判断每个相同位都有1个0了,嗯,,,没有思路,只能暴力破解了

解题

class Solution {
    public int countTriplets(int[] nums) {

        int sum = 0;

        //暴力循环判断
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums.length; j++) {
                for (int k = 0; k < nums.length; k++) {

                    if ((nums[i]&nums[j]&nums[k]) == 0){
                        sum++;
                    }

                }
            }
        }

        return sum;
    }
}

果不其然超出了时间限制

要是能优化一下能跳过重复的查询就好

官方解答如下:

class Solution {
    public int countTriplets(int[] nums) {
        int[] cnt = new int[1 << 16];
        for (int x : nums) {
            for (int y : nums) {
                ++cnt[x & y];
            }
        }
        int ans = 0;
        for (int x : nums) {
            for (int mask = 0; mask < (1 << 16); ++mask) {
                if ((x & mask) == 0) {
                    ans += cnt[mask];
                }
            }
        }
        return ans;
    }
}

总结

在写的时候遇到了判断时逻辑运算符和关系运算符的优先级问题,优先级为关系运算符大于逻辑运算符,所以要在nums[i]&nums[j]&nums[k]外加一个括号。还有就是一开始被这层二进制的皮和标题以及难度为困难吓住了,想的有点复杂,没想到拨开外衣其实也是可以暴力破解的(虽然超时了),还是有待提高。

标签:nums,int,每日,三元组,运算符,++,算法,按位,230304
From: https://www.cnblogs.com/tyrantblue/p/17179289.html

相关文章

  • 每日打卡
    importjava.util.ArrayList;importjava.util.Scanner;publicclasstest{staticScannersc=newScanner(System.in);publicstaticvoidmain(String[]arg......
  • python版基于协同过滤算法的图书管理系统
    基于协同过滤算法的图书管理系统DEMOdemo传送门可以参考一、简介​ 本系统基于推荐算法给用户实现精准推荐图书。​ 根据用户对物品或者信息的偏好,发现物品或者内容......
  • 每日总结
    今天开发了记事本plus版本,可以实现增删改查,并且联合listview控件去显示,学到到listview需要适配去去解析页面熟悉了页面跳转的时候消息传递的妙处,也了解到许多未曾用到的函......
  • m在LTE-A系统载波聚合下的资源分配算法的matlab仿真
    1.算法描述载波聚合即CA,是LTE-A中的关键技术。是为满足用户峰值速率和系统容量提升的要求,增加系统传输带宽的技术,通过CA技术,用户最高上网速率可提升到300Mbps,带来极速上网......
  • 3.5每日总结
    标准数据类型在内存中存储的数据可以有多种类型。例如,一个人的年龄可以用数字来存储,他的名字可以用字符来存储。Python定义了一些标准类型,用于存储各种类型的数据。Py......
  • m在LTE-A系统载波聚合下的资源分配算法的matlab仿真
    1.算法描述        载波聚合即CA,是LTE-A中的关键技术。是为满足用户峰值速率和系统容量提升的要求,增加系统传输带宽的技术,通过CA技术,用户最高上网速率可提升到300......
  • C/C++ 数据结构堆结构算法的实现
    #include<stdio.h>#include<stdlib.h>#include<string.h>//堆的算法实现#defineDEFAULT_CAPCITY128typedefstruct_Heap{int*arr;//存储堆元素的数组......
  • m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真
    1.算法描述       许多室内应用需要有关物体的空间信息。示例应用程序包括项目查找,对象级别映射和在仓库或库中管理的大型对象。然而,使用802.11,可见光或声学的基于......
  • m基于kmeans和SVM的网络入侵数据分类算法matlab仿真
    1.算法描述首先计算整个数据集合的平均值点,作为第一个初始聚类中心C1;然后分别计算所有对象到C1的欧式距离d,并且计算每个对象在半径R的范围内包含的对象个数W。此......
  • m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真
    1.算法描述许多室内应用需要有关物体的空间信息。示例应用程序包括项目查找,对象级别映射和在仓库或库中管理的大型对象。然而,使用802.11,可见光或声学的基于位置的服务的传......