【LeetCode每日一题:982. 按位与为零的三元组+从递归超时到记忆化搜索】

news2024/11/18 5:38:29

在这里插入图片描述

题目描述

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

求解思路

  1. 看到该题目,再看数据量,很容易确定题目的大致求解方法。
  2. 通过分析,我们可以确定该题目可以通过递归求解,该题递归的过程就是求全排列的过程,只不过需要我们注意的是,题目中会有条件限制,比如说三元数组,要求我们只能求解三个数,判断&运算最后的结果是否为0。
  3. 需要注意的一点是,我们在进行递归的时候,当还没有数的时候, 此时第一个数是必须进行选择的,
    这点需要注意一下。
  4. 递归肯定是超时的,我们可以继续进行改进,改成记忆化搜索求解该题。

实现代码

递归版本1

class Solution {
    private int res=0;

    public int countTriplets(int[] nums) {
        int n=nums.length;
        if(n==0) return res;
        dfs(nums,0,0);
        return res;
    }

    public void dfs(int[] nums,int cnt,int sum){
        if(cnt>3) return;
        if(cnt==3&&sum==0){
            res++;
            return;
        }
        for(int i=0;i<nums.length;i++){
            if(cnt==0) dfs(nums,cnt+1,nums[i]);
            else dfs(nums,cnt+1,sum&nums[i]);
        }
    }
}

递归版本2

class Solution {
    

    public int countTriplets(int[] nums) {
        int n=nums.length;
        if(n==0) return 0;
        return dfs(nums,0,0);
    }

    public int dfs(int[] nums,int cnt,int sum){
        if(cnt>3) return 0;
        if(cnt==3&&sum==0){
            return 1;
        }
        int ans=0;
        for(int i=0;i<nums.length;i++){
            if(cnt==0) ans+=dfs(nums,cnt+1,nums[i]);
            else ans+=dfs(nums,cnt+1,sum&nums[i]);
        }
        return ans;
    }
}

记忆化搜索

class Solution {

    public int countTriplets(int[] nums) {
        int n=nums.length;
        if(n==0) return 0;
        int max=0;
        for(int i=0;i<n;i++) max=Math.max(max,nums[i]);
        int[][] dp=new int[4][max+1];
        for(int i=0;i<4;i++) Arrays.fill(dp[i],-1);
        return dfs(dp,nums,0,0);
    }

    public int dfs(int[][] dp,int[] nums,int cnt,int sum){
        if(cnt>=4) return 0;
        if(cnt==3&&sum==0){
            return dp[cnt][sum]=1;
        }
        if(dp[cnt][sum]!=-1) return dp[cnt][sum];
        int ans=0;
        for(int i=0;i<nums.length;i++){
            if(cnt==0) ans+=dfs(dp,nums,cnt+1,nums[i]);
            else ans+=dfs(dp,nums,cnt+1,sum&nums[i]);
        }
        dp[cnt][sum]=ans;
        return ans;
    }
}

运行结果

在这里插入图片描述

想说的话

算法很难,我们可以不聪明,但是我们不能不努力,不能说放弃就放弃!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Common API环境部署(保姆级教程,填充了很多坑)

Common API环境部署目录一、前言及结果展示二、Windows下安装docker1. 准备工作[1.1 Docker安装包](https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe)[1.2 Wsl2安装包](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.ms…

【数据结构】链式二叉树

前言 在前面我们学习了一些二叉树的基本知识&#xff0c;了解了它的结构以及一些性质&#xff0c;我们还用数组来模拟二叉树建立了堆&#xff0c;并学习了堆排序&#xff0c;可是数组结构的二叉树有很大的局限性&#xff0c;平常我们用的最多树结构的还是链式二叉树&#xff0c…

【自律】学习方案

自律来源 轶事 陆奇以精力旺盛著称&#xff0c;通常凌晨4点起床&#xff0c;先查邮件&#xff0c;然后在跑步机上跑4英里&#xff0c;边跑边听古典音乐或看新闻。早上5点至6点至办公室&#xff0c;利用这段时间不受别人干扰准备一天的工作&#xff0c;然后一直工作到晚上10点&a…

搜索引擎的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着互联网的快速发展&#xff0c;网络上的数据也随着爆炸式地增长。如何最快速筛选出对我们有用的信息成了主要问题。搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息&#xff0c;在对信息进行组织和处理后&…

ks通过恶意低绩效来变相裁员(五)绩效申诉就是「小六自证吃了一碗凉粉」

目录 一、小六吃了一碗凉粉 二、给你差绩效 公司告诉你可以绩效申诉 1、公司的实际目的是啥 2、你一旦自证&#xff0c;就掉入了陷阱 三、谁主张谁举证——让公司证明它绩效考核的客观性和公平性 四、针对公司的流氓恶意绩效行为&#xff0c;还有其他招吗 五、当公司用各…

学习方法--找书,背书,利器

学习方法 前言&#xff1a; 1、所谓的技术/技能&#xff0c;可比作对一类书的学习&#xff0c;那么第一步&#xff0c;就是要找这方面的书本来学习&#xff0c;简称为“找书”&#xff0c;找书既是指资料&#xff0c;也是指经验总结等等&#xff0c;第二步&#xff0c;就是背下…

【基础算法】双指针---数组元素的目标和

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

CSS 基础:选择器、盒模型、布局

CSS&#xff08;Cascading Style Sheets&#xff09;是用于定义 HTML 或 XML 文档中的样式的一种语言。它可以控制网页的排版、字体、颜色、背景等多个方面&#xff0c;从而使网页呈现出美观的视觉效果和良好的用户体验。其中&#xff0c;选择器、盒模型和布局是 CSS 基础中的三…

Pod控制器

一.Pod控制器及其功用Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启策略无效&#…

C. Zero Path

给你一个矩阵&#xff0c;矩阵中每个点是1或者-1&#xff0c;问你是否存在一条路径从左上角到右下角路径上所经过点的总和是0。 类似于数字三角型&#xff0c;dp[i][j]可以用dp[i-1][j]的位置 和 dp[i][j-1]的位置传递过来&#xff0c;我们可以保存每个位置可以达成的和的所有可…

ROS小车研究笔记3/4/2023:自动导航launch文件解析

对于ROS小车导航算法基本原理和使用方法&#xff0c;可以看笔记http://t.csdn.cn/NUWHt 1 启动小车导航节点&#xff1a;turn_on_wheeltec_robot navigation.launch <launch><!-- 开启机器人底层相关节点 同时开启导航功能--><include file"$(find turn_on…

P6专题:如何通过P6 Professional创建及管理 EPS

目录 引言 创建EPS 引言 牢记P6数据结构&#xff0c;这是P6编制计划的层次&#xff1a;EPS-项目-WBS-作业。 EPS&#xff08;Enterprise Breakdown Structure&#xff09;&#xff1a;企业项目结构&#xff0c;用于组织项目&#xff0c;并进行数据汇总。EPS 代表 Primavera…

XFI和SFI的差异

目录 相同/相似点 应用参考模型 Trace Length 不同点 眼图模板 B点处的眼图模板对比 C点处的眼图模板对比 通道损耗 CDR支持 预加重和均衡 DC特性 RETIMER的用法 通过研究INF-8077i 10 Gigabit Small Form Factor Pluggable Module规范和SFF-8431 Specifications for …

【STM32】入门(十四):FreeRTOS-任务

1、简述 FreeRTOS应用程序由一组独立的任务构成。 在任何时间点&#xff0c;应用程序中只能执行一个任务&#xff0c;FreeRTOS调度器负责决定所要执行的任务。 每个任务在自己的上下文中执行&#xff0c;不依赖于系统内的其他任务或 FreeRTOS的调度器本身。 FreeRTOS调度器负责…

51单片机IIC时序详细分析并驱动EEPROM存储方案应用------day9

51单片机IIC驱动EEPROM存储方案应用------day9 1.常见存储器件&#xff1a; 铁电&#xff0c; E2PROM&#xff0c; FLASH。 共同特点&#xff1a; 掉电后数据不丢失 各自特点&#xff1a; 铁电&#xff1a; 理论上可以无限次擦写&#xff0c; 操作简单&#xff0c; 但是容量小。…

进销存管理系统

技术&#xff1a;Java等摘要&#xff1a;进销存管理系统是为了实现企业仓库商品管理的系统化、规范化和自动化&#xff0c;从而提高企业管理效率而设计开发的管理信息系统。它完全取代了过去一直用人工管理的工作方式&#xff0c;避免了由于管理人员手工操作上的疏忽以及管理质…

【Linux】基本系统维护命令

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享C/C相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

P6专题:P6模块/组件简要介绍(P6,Professional,API,TeamMember,WebService)

目录 一 引言 二 P6组件 P6 P6 Professional Team Member PC Team Member App Integration API WebService 一 引言 Oracle Primavera P6 EPPM 是基于“角色”设计的企业级项目管理专业软件&#xff0c;包含了如下几个组件/模块&#xff0c;解决不同维度的问题&#x…

linux入门---shell感性认识

命令行解释器 我们目前学了很多的指令&#xff0c;并且这些指令在磁盘上都是以文件的形式存在的&#xff1a; 通过file可以查看这些文件的信息&#xff0c;我们发现这些文件都含有executable这个单词&#xff0c;那么executable的意思就是这个文件在x86-64平台下是可以执行的…

【巨人的肩膀】JAVA面试总结(五)

1、&#x1f4aa; 目录1、&#x1f4aa;1.1、什么是Spring框架1.2、Spring、SpringMVC、SpringBoot三者关系1.3、谈谈对于Spring IoC 和 DI 的理解1.4、什么是依赖注入&#xff1f;可以通过多少种方式完成依赖注入1.5、什么是Spring Bean1.6、将一个类声明为Bean的注解有哪些1.…