【LeetCode-面试经典150题-day18】

目录

17.电话号码的字母组合

 77.组合

46.全排列 

52.N皇后Ⅱ 


 

17.电话号码的字母组合

题意:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

【输入样例】digits="23"

【输出样例】["ad","ae","af","bd","be","bf","cd","ce","cf"]

class Solution {public List<String> letterCombinations(String digits) {List<String> ans = new ArrayList<String>();if(digits.length() == 0){return ans;}Map<Character,String> phoneMap = new HashMap<Character,String>(){{put('2',"abc");put('3',"def");put('4',"ghi");put('5',"jkl");put('6',"mno");put('7',"pqrs");put('8',"tuv");put('9',"wxyz");}};findString(ans,phoneMap,digits,0,new StringBuffer());return ans;}public void findString(List<String> ans, Map<Character,String> phoneMap,String digits,int index,StringBuffer curAns){if(index == digits.length()){//证明全部遍历完比ans.add(curAns.toString());//把找到的答案转成String类型存到列表中}else{char digit = digits.charAt(index);//取出字符,到map中获取对应的值String letters = phoneMap.get(digit);for(int i=0;i<letters.length();++i){curAns.append(letters.charAt(i));//递归调用,主要是用于找到下一位可能的字符findString(ans,phoneMap,digits,index+1,curAns);//递归回来进行回溯,把当前的字符删掉,寻找更多可能curAns.deleteCharAt(index);}}}
}

时间: 击败了46.35%

内存: 击败了26.39%

 77.组合

题意:

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

【输入样例】n=4,k=2

【输出样例】

[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]
class Solution {List<List<Integer>> ans = new ArrayList<List<Integer>>();public List<List<Integer>> combine(int n, int k) {findAns(1,n,k,new ArrayList<>());//从1开始找return ans;}public void findAns(int index,int n,int k,List<Integer> list){if(k == 0){//找到正确的答案,添加ans.add(new ArrayList<>(list));return;}for(int i=index;i<=n-k+1;++i){list.add(i);findAns(i+1,n,k-1,list);list.remove(list.size()-1);}}
}

时间: 击败了56.50%

内存: 击败了5.94%

46.全排列 

题意:

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

【输入样例】nums=[1,2,3]

【输出样例】[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路:递归回溯+哈希表

1. 构建一个哈希map,用来存放当前那一些数字可以用,那一些数字不可以用;

2. 递归函数的作用是找到第index位上可以是那个数字,数字是位于数字中,所以对数组进行枚举来获得第i位的值,之后用哈希map判断此位数字是否已经被用过。被用过继续找,没被用过则添加到list中,并修改标志位,继续寻找第index+1位;

3.回溯的时候除了要移开最后一位数字,还需要重新修改标志位。

class Solution {List<List<Integer>> ans = new ArrayList<List<Integer>>();public List<List<Integer>> permute(int[] nums) {//构造map,初始化所有数字现在都可以用int len = nums.length;Map<Integer,Boolean> useMap= new HashMap<Integer,Boolean>();for(int i=0;i<len;++i){useMap.put(nums[i],true);}searchOrder(1,nums,len,useMap,new ArrayList<>());//从第一位开始找return ans;}public void searchOrder(int index,int[] nums,int len,Map<Integer,Boolean> useMap,List<Integer> list){if(index == len+1){//找到正确的答案,添加ans.add(new ArrayList<>(list));return;}for(int i=0; i < len;++i){//从第一位到最后一位,可以选择那一些int num = nums[i];if(useMap.get(num) == true){list.add(num);//修改标志位useMap.put(num,false);searchOrder(index+1,nums,len,useMap,list);list.remove(list.size()-1);useMap.put(num,true);}}}
}

时间: 击败了78.23%

内存: 击败了48.52% 

52.N皇后Ⅱ 

题意:

n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

【输入样例】n=4

【输出样例】2

解题思路:递归回溯+布尔数组

为什么是!row[i] && !dia[index-i+n] && !assDia[index+i]?

row[i]:好理解,同一列已经有值

but,dia和assDia中的取值为什么是这样书写的呢?

 

class Solution {int ans = 0;public int totalNQueens(int n) {//n皇后问题//任意两个皇后不能在同一横轴,纵轴,对角线上//三个数组,表示当前纵轴,正对角线,副对角线上是否有值,默认falseboolean[] row = new boolean[n+1];boolean[] dia = new boolean[2*n+1];boolean[] assDia = new boolean[2*n+1];search(1,n,row,dia,assDia);//从第一行开始判断return ans;}private void search(int index,int n, boolean[] row, boolean[] dia, boolean[] assDia){if(index == n+1){++ans;return;}//index表示当前查找第几行,所以遍历遍历列就可以了for(int i=1;i<=n;i++){if(!row[i] && !dia[index-i+n] && !assDia[index+i]){row[i] = dia[index-i+n] = assDia[index+i] = true;//已经有值search(index+1,n,row,dia,assDia);//回溯row[i] = dia[index-i+n] = assDia[index+i] = false;}}}
}

时间: 击败了100.00%

内存: 击败了74.08% 

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

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

相关文章

数据分层(Data layering)

摘要 数据分层建设旨在实现数据的逻辑和物理分离&#xff0c;处理不同层次的数据需求&#xff0c;提高数据管理的灵活性和可扩展性。 分层结构&#xff1a;将数据按照不同的层次进行划分和组织&#xff0c;可以在每个层次中设立特定的功能和目的。原始数据层用于存储采集到的…

mysql:[Some non-transactional changed tables couldn‘t be rolled back]不支持事务

1. mysql创建表时默认引擎MyIsam&#xff0c;因此不支持事务的操作&#xff1b; 2. 修改mysql的默认引擎&#xff0c;可以使用show engine命令查看支持的引擎&#xff1a; 【my.conf详情说明】my.cnf配置文件注释详解_xiaolin01999的博客-CSDN博客 3. 原来使用MyIsam创建的表…

[ AT_agc009_c]Division into Two

题目传送门 引 大家都知道集合吧,原谅我喜欢说废话 解法 先钦定 A > B A>B A>B, 先把数排好序得到数组 a a a&#xff0c;考虑先解决集合 X X X的问题&#xff0c; 设计状态&#xff1a; 明显只有一维&#xff08; n < 1 e 5 n<1e5 n<1e5&#xff09…

Linux系统中驱动面试分享

​ 1、驱动程序分为几类&#xff1f; 字符设备驱动 块设备驱动 网络设备驱动 2、字符设备驱动需要实现的接口通常有哪些 open、close、read、write、ioctl等接口。 3、主设备号与次设备号的作用 主设备号和次设备号是用来标识系统中的设备的&#xff0c;主设备号用来标识…

算法通关村第十八关——回溯

回溯很大感觉就是多重递归&#xff0c;在递归的题目中&#xff0c;例如斐波那契数列&#xff0c;只需要考虑当前情况以及他的子情况。而在回溯中&#xff0c;要进行很多次递归&#xff0c;并且要对条件进行处理。 LeetCode257:给你一个二叉树的根节点root,按任意顺序&#xff…

postgresql并行查询(高级特性)

######################## 并行查询 postgresql和Oracle一样支持并行查询的,比如select、update、delete大事无开启并行功能后,能够利用多核cpu,从而充分发挥硬件性能,提升大事物的处理效率。 pg在9.6的版本之前是不支持的并行查询的,从9.6开始支持并行查询,但是功能非常…

OpenCV(十六):高斯图像金字塔

目录 1.高斯图像金字塔原理 2.高斯图像金字塔实现 1.高斯图像金字塔原理 高斯图像金字塔是一种用于多尺度图像表示和处理的重要技术。它通过对图像进行多次高斯模糊和下采样操作来生成不同分辨率的图像层级&#xff0c;每个层级都是原始图像的模糊和降采样版本。 以下是高斯…

count(1)与count(*)的区别、ROUND函数

部分问题 1. count(1)与count(*)的区别2. ROUND函数3. SQL19 分组过滤练习题4. Mysql bigdecimal 与 float的区别5. 隐式内连接与显示内连接 &#xff08;INNER可省略&#xff09; 1. count(1)与count(*)的区别 COUNT(*)和COUNT(1)有什么区别&#xff1f; count(*)包括了所有…

图表背后的故事:数据可视化的威力与影响

数据可视化现在在市场上重不重要&#xff1f;这已经不再是一个简单的问题&#xff0c;而是一个不可忽视的现实。随着信息时代的来临&#xff0c;数据已经成为企业和组织的核心资产&#xff0c;而数据可视化则成为释放数据价值的重要工具。 在当今竞争激烈的商业环境中&#xf…

小赢科技,寻找金融科技核心价

如果说金融是经济的晴雨表&#xff0c;是通过改善供给质量以提高经济质量的切入口&#xff0c;那么金融科技公司&#xff0c;就是这一切行动的推手。上半年&#xff0c;社会经济活跃程度提高背后&#xff0c;金融科技公司既是奉献者&#xff0c;也是受益者。 8月29日&#xff0…

数据艺术:精通数据可视化的关键步骤

数据可视化是将复杂数据转化为易于理解的图表和图形的过程&#xff0c;帮助我们发现趋势、关联和模式。同时数据可视化也是数字孪生的基础&#xff0c;本文小编带大家用最简单的话语为大家讲解怎么制作一个数据可视化大屏&#xff0c;接下来跟随小编的思路走起来~ 1.数据收集和…

16 | Spark SQL 的 UDF(用户自定义函数)

UDF(用户自定义函数):Spark SQL 允许用户定义自定义函数,以便在 SQL 查询或 DataFrame 操作中使用。这些 UDF 可以扩展 Spark SQL 的功能,使用户能够执行更复杂的数据操作。 示例: // 注册UDF spark.udf.register("calculateDiscount", (price: Double, disc…

抓包-要抓取Spring Boot应用程序的请求

要抓取Spring Boot应用程序的请求&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 确保你已经按照之前提到的方法设置了Charles代理&#xff0c;并在Charles的SSL代理设置中添加了Spring Boot应用程序的域名。 2. 在Spring Boot应用程序的代码中&#xff0c;添加以下配…

华为云Stack的学习(四)

五、Service OM资源管理 1.Service OM简介 1.1 Service OM介绍 在华为云Stack解决方案中&#xff0c;Service OM是FusionSphere OpenStack的操作管理界面&#xff0c;是资源池&#xff08;计算、存储、网络&#xff09;以及基础云服务的管理工具。 1.2 Service OM定位 Serv…

Apifox(1)比postman更优秀的接口自动化测试平台

Apifox介绍 Apifox 是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;定位 Postman Swagger Mock JMeter。通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好 API 文档&#xff0c;API 调试、API 数据 Mock、API 自…

Mysql数据库(3)—架构和日志

Mysql的架构设计 Mysql分为Server层和存储引擎层&#xff1a; Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff…

【GitHub 个人主页】适应于初学者的自定义个人主页设置

▚ 00 自定义GitHub主页的教程 &#x1f341; 【保姆级教程】手把手教你用github制作学术个人主页&#xff08;学者必备&#xff09; ▚ 01 优秀案例 1.1 添加Stats &#x1f383; 网址为&#xff1a;Stats & Most Used Langs

进程、线程、内存管理

目录 进程和线程区别 进程和线程切换的区别 系统调用流程 系统调用是否会引起线程切换 为什么需要使用虚拟内存 进程和线程区别 本质区别&#xff1a; 进程是资源分配的基本单元。 线程是操作系统调度的基本单元。 地址空间&#xff1a; 进程具有独立的虚拟地址空间。 线程…

华为OD:IPv4地址转换成整数

题目描述&#xff1a; 存在一种虚拟IPv4地址&#xff0c;由4小节组成&#xff0c;每节的范围为0-255&#xff0c;以#号间隔&#xff0c;虚拟IPv4地址可以转换为一个32位的整数&#xff0c;例如&#xff1a; 128#0#255#255&#xff0c;转换为32位整数的结果为2147549183&#…

【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「NUFE」解题思路

第十届CCF大数据与计算智能大赛&#xff08;2022 CCF BDCI&#xff09;已圆满结束&#xff0c;大赛官方竞赛平台DataFountain&#xff08;简称DF平台&#xff09;正在陆续释出各赛题获奖队伍的方案思路&#xff0c;欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…