leetcode第17题

简介: 假如是 "23" ,那么第 1 次 for 循环结束后变为 a, b, c;第 2 次 for 循环的第 1 次 while 循环 a 出队,分别加上 d e f 然后入队,就变成 b c ad ae af第 2 次 for 循环的第 2 次 while 循环 b 出队,分别加上 d e f 然后入队,就变成 c ad ae af bd be bf第 2 次 for 循环的第 3 次 while 循环 c 出队,分别加上 d e f 然后入队,就变成 ad ae af bd be bf cd ce cf这样的话队列的元素长度再也没有等于 1 的了就出了 while 循环。

image.png

top17

给一串数字,每个数可以代表数字键下的几个字母,返回这些数字下的字母的所有组成可能。

解法一 定义相乘

自己想了用迭代,用递归,都理不清楚,灵机一动,想出了这个算法。

把字符串 "23" 看成 ["a","b",c] * ["d","e","f"] ,而相乘就用两个 for 循环实现即可,看代码应该就明白了。

publicList<String>letterCombinations(Stringdigits) {
List<String>ans=newArrayList<String>();
for (inti=0; i<digits.length(); i++) {
ans=mul(ans, getList(digits.charAt(i) -'0'));
    }
returnans;
}
publicList<String>getList(intdigit) {
StringdigitLetter[] = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
List<String>ans=newArrayList<String>();
for (inti=0; i<digitLetter[digit].length(); i++) {
ans.add(digitLetter[digit].charAt(i) +"");
        }
returnans;
    }
//定义成两个 List 相乘publicList<String>mul(List<String>l1, List<String>l2) {
if (l1.size() !=0&&l2.size() ==0) {
returnl1;
    }
if (l1.size() ==0&&l2.size() !=0) {
returnl2;
    }
List<String>ans=newArrayList<String>();
for (inti=0; i<l1.size(); i++)
for (intj=0; j<l2.size(); j++) {
ans.add(l1.get(i) +l2.get(j));
        }
returnans;
}

解法二 队列迭代

参考这里,果然有人用迭代写了出来。主要用到了队列。


publicList<String>letterCombinations(Stringdigits) {
LinkedList<String>ans=newLinkedList<String>();
if(digits.isEmpty()) returnans;
String[] mapping=newString[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
ans.add("");
for(inti=0; i<digits.length();i++){
intx=Character.getNumericValue(digits.charAt(i));
while(ans.peek().length()==i){ //查看队首元素Stringt=ans.remove(); //队首元素出队for(chars : mapping[x].toCharArray())
ans.add(t+s);
            }
        }
returnans;
    }

假如是 "23" ,那么

第 1 次 for 循环结束后变为 a, b, c;

第 2 次 for 循环的第 1 次 while 循环 a 出队,分别加上 d e f 然后入队,就变成 b c ad ae af

第 2 次 for 循环的第 2 次 while 循环 b 出队,分别加上 d e f 然后入队,就变成 c ad ae af bd be bf

第 2 次 for 循环的第 3 次 while 循环 c 出队,分别加上 d e f 然后入队,就变成 ad ae af bd be bf cd ce cf

这样的话队列的元素长度再也没有等于 1 的了就出了 while 循环。


这种题的时间复杂度和空间复杂度自己理的不太清楚就没有写了。

相关文章
|
Java Linux iOS开发
Typora最新版破解, 2022年11.7破解成功
Typora最新版破解, 2022年11.7破解成功, 支持Linux, Windows, Mac三端破解, 你值得拥有哦
|
4月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
670 12
Scikit-learn:Python机器学习的瑞士军刀
|
Linux iOS开发 MacOS
typora下载和破解(仅供学习)
Typora 一款 Markdown 编辑器和阅读器 风格极简 / 多种主题 / 支持 macOS,Windows 及 Linux 实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表 目录大纲 / 文件管理 / 导入与导出 ……
162641 11
typora下载和破解(仅供学习)
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
多模态AI核心技术:CLIP与SigLIP技术原理与应用进展
近年来,多模态表示学习在人工智能领域取得显著进展,CLIP和SigLIP成为里程碑式模型。CLIP由OpenAI提出,通过对比学习对齐图像与文本嵌入空间,具备强大零样本学习能力;SigLIP由Google开发,采用sigmoid损失函数优化训练效率与可扩展性。两者推动了多模态大型语言模型(MLLMs)的发展,如LLaVA、BLIP-2和Flamingo等,实现了视觉问答、图像描述生成等复杂任务。这些模型不仅拓展了理论边界,还为医疗、教育等领域释放技术潜力,标志着多模态智能系统的重要进步。
769 13
多模态AI核心技术:CLIP与SigLIP技术原理与应用进展
|
9月前
|
存储 机器学习/深度学习 人工智能
【AI系统】完全分片数据并行 FSDP
本文深入探讨了AI框架中针对权重数据、优化器数据和梯度数据的分布式并行实现,特别是在PyTorch框架下的具体方案。文章首先回顾了通用数据并行和分布式数据并行的概念,重点讨论了同步与异步数据并行的差异。接着,文章详细介绍了如何在PyTorch中实现弹性数据并行,特别是完全分片数据并行(FSDP)的机制,包括其如何通过分片模型状态和剩余状态来减少内存消耗,提高训练效率。此外,文章还探讨了混合精度训练、损失缩放和内存消耗估算等关键技术,为理解和实施高效的分布式训练提供了全面的指导。
282 9
【AI系统】完全分片数据并行 FSDP
|
Python
Pandas进阶--map映射,分组聚合和透视pivot_table详解
Pandas进阶--map映射,分组聚合和透视pivot_table详解
331 0
|
11月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
94 0
Leetcode第二十二题(括号生成)
|
存储 监控 算法
Java堆栈内存管理与优化技巧的实践指南
Java堆栈内存管理与优化技巧的实践指南
|
缓存 自然语言处理 PyTorch
Transformers 4.37 中文文档(二十二)(2)
Transformers 4.37 中文文档(二十二)
93 2
|
存储 算法 索引
LeetCode第36题有效的数独
这篇文章介绍了LeetCode第36题"有效的数独"的解题方法,通过使用三个二维数组分别记录每一行、每一列以及每个3x3宫格内1-9数字出现的次数,来验证给定数独是否有效。