力扣每日一题 特别的排列 DFS 记忆化搜索 位运算 状态压缩DP

Problem: 2741. 特别的排列
在这里插入图片描述

👨‍🏫 参考题解

🍻 暴搜

⏰ 时间复杂度: O ( N ) O(N) O(N)

class Solution {public int specialPerm(int[] nums) {boolean[] visited = new boolean[nums.length];return dfs(nums, 0, -1, visited);}// dfs(depth, prevPos) 定义为: 0到第depth个位置的特殊排列最后一位下标为prevPos 的特殊排列的总数目。private int dfs(int[] nums, int depth, int prevPos, boolean[] visited) {// 如果能枚举完整个数组,意味着这个排列是满足条件的特殊排列,那么返回一种方案if(depth == nums.length) {return 1;}int res = 0;for(int i = 0; i < nums.length; i++) {if(!visited[i]) {// 第0个数不需要考虑是否满足条件if (prevPos == -1 || nums[prevPos] % nums[i] == 0 || nums[i] % nums[prevPos] == 0) {visited[i] = true;res = (res + dfs(nums, depth + 1, i, visited)) % 1000000007;visited[i] = false;}}}return res;}
}

🍻 记忆化搜索

在这里插入图片描述

class Solution {public int specialPerm(int[] nums) {int n = nums.length;Map<String, Integer> memo = new HashMap<>(); boolean[] visited = new boolean[nums.length];return dfs(nums, 0, -1, visited, 0, memo);}// dfs(depth, prevPos, u) 定义为: 0到第depth个位置的特殊排列最后一位下标为为prevPos,且排列对应的二进制占位为u,确定depth位的特殊排列的总数目。private int dfs(int[] nums, int depth, int prevPos, boolean[] visited, int u, Map<String, Integer> memo) {if(depth == nums.length) {return 1;}// 以 prevPos 和 二进制占位为key,只要二进制占位相同,数组长度也必然是相同的。String key = prevPos + "#" + u;if (memo.containsKey(key)) {return memo.get(key);}int res = 0;for(int i = 0; i < nums.length; i++) {if(!visited[i]) {if (prevPos == -1 || nums[prevPos] % nums[i] == 0 || nums[i] % nums[prevPos] == 0) {visited[i] = true;res = (res + dfs(nums, depth + 1, i, visited, u | (1 << i), memo)) % 1000000007;visited[i] = false;}}}memo.put(key, res);return res;}
}

🍻 位运算优化记忆化搜索

在这里插入图片描述

class Solution {public int specialPerm(int[] nums) {int n = nums.length;int[][] memo = new int[1 << nums.length][nums.length];for(int i = 0; i < 1 << nums.length; i++) {Arrays.fill(memo[i], -1);}return dfs(nums, 0, -1, memo);}// dfs(u, prePos) 定义为: 集合为u时,上一次选择的prePos时的特殊排列树目,prePos为-1代表第一次选择。private int dfs(int[] nums, int u, int prevPos, int[][] memo) {// 当集合为nums时,说明形成了特殊的排列// 注意 - 优先级 大于 <<,所以<<要上括号if(u == ((1 << nums.length) - 1)) {return 1;}// 以 prevPos 和 二进制占位为key,只要二进制占位相同,数组长度也必然是相同的。if (prevPos != -1 && memo[u][prevPos] != -1) {return memo[u][prevPos];}int res = 0;for(int i = 0; i < nums.length; i++) {// u >> i & 1 表明u向右移动i位,然后与1做与运算,等于1时表明i在集合u中,等于0则不在u中,代替了visited数组// i不在集合中,才继续遍历if((u >> i & 1) == 0) {if (prevPos == -1 || nums[prevPos] % nums[i] == 0 || nums[i] % nums[prevPos] == 0) {res = (res + dfs(nums, u | (1 << i),  i, memo)) % 1000000007;}}}if(prevPos == -1) {return res;}return memo[u][prevPos] = res;}
}

🍻 填表法 DP

在这里插入图片描述

class Solution {public int specialPerm(int[] nums) {int mod = (int) 1e9 + 7;int dp[][] = new int[1 << nums.length][nums.length ];// dp[u][j] := 当前集合为u,最后一次选择为j时的 特殊排列方案数 for (int i = 0; i < nums.length; i++) {// 选择i后,集合中增加idp[1 << i][i] = 1;}for (int u = 0; u < 1 << nums.length; u++) {// 考虑当前集合为u时,加入新的数到集合中for (int j = 0; j < nums.length; j++) {// 集合u中不存在j时,j才能加入集合if ((u >> j & 1) == 0) {// 判断上一个选择的数k是否与j满足题意要求for (int k = 0; k < nums.length; k++) {// k不在集合中时 说明上一个数选择的数不可能是kif((u & 1 << k) > 0) {// k和j满足题意要求时才能形成特殊排列if ((nums[j] % nums[k] == 0 || nums[k] % nums[j] == 0)) {dp[u | 1 << j][j] = (dp[u | 1 << j][j] + dp[u][k]) % mod;}}}}}}int sum = 0;// 集合为nums,遍历最后一次选择的数for (int j = 0; j < nums.length; j++) {sum = (sum + dp[(1 << nums.length) - 1][j]) % mod;}return sum;}
}

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

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

相关文章

目标检测系列(二)yolov1的全面讲解

目录 1、网络结构 2、检测原理 3、制作训练正样本方法 4、损失函数 5、前向推理 6、模型缺限 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。YOLO被称为Region-free方法&#xff0c;相比于Region-based方法&#xff0…

AI已经火了一年了,真正属于普通人的机会在哪里?

对普通人来说&#xff0c;AI的机会在哪里&#xff1f; 这是过去一年来&#xff0c;我收到过最多的问题 在这篇文章里&#xff0c;我会把我目前对AI的理解阐述出来&#xff0c;分享3个普通人能够把握的方向 讲清楚在现在这个时间节点&#xff0c;当我们在说搞AI的时候&#x…

RAG应用要如何吃到大模型长上下文的红利?-LongRAG

去年底的时候&#xff0c;笔者写过&#xff0c;与其在RAG系统上雕花&#xff0c;可以重新思考一下&#xff0c;自己的业务场景是否非RAG不可吗&#xff1f;随着去年大模型的蓬勃发展&#xff0c;长度外推、更长的上下文模型&#xff0c;更厉害的中文底座大模型&#xff0c;都可…

RabbitMq camel

真实的项目如果 交换器/ 队列很多 建议在管理页面新建exchange / queue/ rootingKey /vhost, 而不要写死在springboot项目里 camel按rooting key发送消息: 最推荐 .to("rabbitmq:sino.nannan?routingKeysino.key&skipExchangeDeclaretrue&skipQueueDeclaretru…

Python 挖坑式填充Excel模板内容(包括页眉/SheetName/logo)

纵览 Python处理Excel的方式--解压缩方式1、导包2、对模板文件进行解压缩3、对解压缩后文件层级进行介绍4、准备需要载入的数据5、模板挖坑6、运行替换代码7、压缩文件8、生成文件9、完成代码10、可能遇到的问题 结语 Python处理Excel的方式–解压缩方式 在处理Excel中过程中&…

《人人都是产品经理》:项目的坎坷一生

《人人都是产品经理》&#xff1a;项目的坎坷一生 产品VS项目产品经理和项目经理 一切项目从kick off 开始工作量预估Kick Off的大致也就15分钟 写文档咯UML图用例文档UCdemo也得做 需求活在项目中bug等级有多高bug流转过程 以终为始 产品VS项目 项目定义&#xff1a;是只会进…

怎么压缩pdf文件大小,如何压缩pdf文件大小

pdf文件怎么压缩&#xff1f;在当下这个信息爆炸的时代&#xff0c;无论是在工作场所还是校园中&#xff0c;我们经常会面临需要处理大文件的情况&#xff0c;而PDF格式作为一种保留文档结构和布局完整性的理想选择&#xff0c;有时候pdf文件太大&#xff0c;因此&#xff0c;对…

typec密封胶防水用什么胶好?

typec密封胶防水用什么胶好&#xff1f; 对于Type-C连接器的防水密封&#xff0c;行业内普遍推荐使用单组份环氧型热固化胶。这种胶水具有以下优点&#xff0c;使其成为Type-C防水密封的理想选择&#xff1a; 粘稠度易于调整&#xff1a;这有助于胶水在点胶过程中更好地渗透到T…

2024年二级建造师机电工程专业考试题库分享。

1.调查表法通常与&#xff08;&#xff09;结合使用&#xff0c;以便更快地发现问题原因。 A.经验法 B.分层法 C.样本调查法 D.对比分析法 答案&#xff1a;B 解析&#xff1a;题干内容提示调查表法往往会与分层法结合起来应用&#xff0c;故B选项正确。 2.在质量统计分…

压缩图片png格式该怎么操作?试试下面这3个图片压缩工具吧

png是经常用于储存图片的一种格式&#xff0c;随着现在图片在日常工作和生活中的广泛使用&#xff0c;在很多的使用场景中都有应用。png的图片质量高而且支持无损压缩&#xff0c;在缩小图片的时候不会因为压缩而影响图片的清晰度&#xff0c;更适合在网上的存储、分享或者传输…

论文阅读MVBench: A Comprehensive Multi-modal Video Understanding Benchmark

摘要(Abstract)&#xff1a; 论文介绍了MVBench&#xff0c;这是一个全新的多模态视频理解基准测试&#xff0c;旨在评估多模态大型语言模型&#xff08;MLLMs&#xff09;在视频理解方面的能力。 目前许多基准测试主要集中在静态图像任务的空间理解上&#xff0c;而忽视了动…

c++进程间通信--zeromq

ZeroMQ&#xff08;也写作 MQ、0MQ 或 zmq&#xff09;是一个高性能的异步消息队列库&#xff0c;提供了一种灵活的方式来实现进程间通信&#xff08;IPC&#xff09;以及网络通信。在C中使用ZeroMQ进行进程间通信非常直观和高效。zmq的通信模式如下&#xff1a; 下面先说明请求…

第 11 课:组件介绍与自定义开发

本讲主要介绍了隐语的组件标准、已有的组件能力以及进一步的自定义开发流程。经过本讲的学习&#xff0c;可以为将隐语集成到任意调度系统&#xff0c;基于Kusica/SecretPad进行二次开发&#xff0c;以及参与隐语开放标准共建建立基础。 一、隐语开放标准 隐语提出的适用于隐私…

证件照制作工具有哪些?这6个帮你自制证件照

许多人可能认为&#xff0c;制作一张符合标准要求的证件照&#xff0c;必须亲自前往照相馆。 然而&#xff0c;事实上&#xff0c;我们完全可以使用手机或电脑上的证件照制作app&#xff0c;自己轻松完成证件照的制作。无论是更换背景颜色&#xff0c;还是调整照片尺寸&#x…

【ARM】Ulink不同的系列对于芯片的支持和可以支持keil软件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解不同版本的ULINK可以支持的芯片架构&#xff0c;和ULINK可以和哪个系列的keil软件进行在线调试 2、 问题场景 用于了解不同ULINK仿真器对于芯片的支持是不一样的&#xff0c;并不是ULINK可以支持所有的keil软件…

2024系统分析师考试总结

考试缘由 我自己在毕业不久就考过了中级的软件设计师&#xff0c;这几年换到外企后事情不多&#xff0c;今年初定计划的时候就想着不如考个系统分析师吧。为什么选这个类别呢&#xff1f;按道理我主做程序开发&#xff0c;如果去考系统架构师通过率可能会大一些&#xff0c;但…

【Uniapp微信小程序】图片左右分割/分割线切割图片/图片批量分割线切割

特别说明:本文章因业务组件功能,不完全开放/暂vip可见,有需要者留言找博主! ps:注意!!本效果为图片分割切割!!不是文档切割!!图片仅供参考! 效果图 父组件 / 上传图片页面(index) 写一个上传按钮即可,事件方法: uni.chooseMessageFile({extension: [".j…

Unity | Shader基础知识(第十六集:简单的全息扫描效果)

目录 一、前言 二、准备模型 三、 场景准备 四、代码准备 五、透明度设置 六、补充介绍 1.Pass语法介绍 2.ColorMask 七、作者的碎碎念 一、前言 这节课的内容是接着弧形边缘光的效果之后做的。 Unity | Shader基础知识(第十四集&#xff1a;简单效果练习)_unity shade…

idea或vscode支持vue语法,ts可解析*.vue

一、ide不能解析vue文件 刚开始导入时&#xff0c;在vscode中的vue文件中内容都是灰色的 ide不能解析vue解决方法&#xff1a; 1.idea或webstorm安装vue.js插件 2.在vscode中 vue2.0的项目安装vetur插件vue3.0及以上的项目安装Vue-official插件&#xff08;之前是Volar&…

PC XMind v24 解锁版安装教程 (全球领先的商业思维导图软件)

前言 XMind 是一款专业的全球领先的商业思维导图软件&#xff0c;在国内使用广泛&#xff0c;拥有强大的功能、包括思维管理、商务演示、与办公软件协同工作等功能。它采用全球先进的Eclipse RCP软件架构&#xff0c;是集思维导图与头脑风暴于一体的可视化思考工具&#xff0c…