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 循环。


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

相关文章
|
8月前
|
消息中间件 Kubernetes NoSQL
LeetCode 1359、1360
LeetCode 1359、1360
单链表反转 LeetCode 206
单链表反转 LeetCode 206
82 0
leetcode 283 移动零
leetcode 283 移动零
61 0
|
算法
LeetCode——944. 删列造序
LeetCode——944. 删列造序
115 0
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
leetcode第48题
|
算法
leetcode第45题
时间复杂度:O(n)。 空间复杂度:O(1)。 这里要注意一个细节,就是 for 循环中,i < nums.length - 1,少了末尾。因为开始的时候边界是第 0 个位置,steps 已经加 1 了。如下图,如果最后一步刚好跳到了末尾,此时 steps 其实不用加 1 了。如果是 i < nums.length,i 遍历到最后的时候,会进入 if 语句中,steps 会多加 1 。
116 0
leetcode第45题
leetcode第54题
在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。
110 0
leetcode第54题
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
leetcode第31题
我们想几个问题。 要想使得数字变大,只要任意一位变大就可以。 要想得到刚好大于原来的数字,要变个位。 这里变大数字,只能利用交换。 如果从个位开始,从右往左进行,找一个比个位大的,交换过来,个位的数字交换到了更高位,由于个位的数字较小,所以交换过去虽然个位变大了,但数字整体变小了。例如 1 3 2,把 2 和 3 交换,变成 1 2 3,个位变大了,但整体数字变小了。 个位不行,我们再看十位,如果从十位左边找一个更大的数字交换过来,和个位的情况是一样的,数字会变小。例如 4 1 2 3,把 2 和 4 交换,2 1 4 3,数字会变小。如果从
leetcode第31题