数组
大家好,我是老马。
今天我们一起来学习一下数组这种数据结构。
主要知识
数组需要拆分下面几个部分:
-
理论介绍
-
源码分析
-
数据结构实现?
-
题目练习(按照算法思想分类)
-
梳理对应的 sdk 包
-
应用实战
因为这个是 leetcode 系列,所以重点是 4、5(对4再一次总结)。
为了照顾没有基础的小伙伴,会简单介绍一下1的基础理论。
简单介绍1,重点为4。其他不是本系列的重点。
17 电话号码的字母组合 letter-combinations-of-a-phone-number
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23” 输出:[“ad”,”ae”,”af”,”bd”,”be”,”bf”,”cd”,”ce”,”cf”] 示例 2:
输入:digits = “” 输出:[] 示例 3:
输入:digits = “2” 输出:[“a”,”b”,”c”]
提示:
0 <= digits.length <= 4 digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
v1-回溯
思路
用回溯来实现组合。
核心流程
记录下映射关系
0) n==0 返回空列表
1)数字的映射信息
string[] mappings = {
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
数字和下标的关系: ix = num-2;
2)digitIx 从位置0开始,c = digits[digitIx];
ix = c - ‘0’,找到映射的 mapping 字符串。
首先遍历 i 0开始遍历 mapping 字符串
a. path.append(mapping[i])
b. backtrack(res, path, digitIx +1)
c. 撤销 path
3) 终止条件
如果 digitIx 达到末尾,或者 path 长度满了,加入结果集合。
实现
String[] mappings = {
"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};
public List<String> letterCombinations(String digits) {
List<String> res = new ArrayList<>();
if (digits == null || digits.isEmpty()) return res;
StringBuilder path = new StringBuilder();
backtrack(res, digits, path, 0);
return res;
}
private void backtrack(List<String> res, String digits, StringBuilder path, int ix) {
if (ix == digits.length()) { // 到达末尾
res.add(path.toString());
return;
}
int digit = digits.charAt(ix) - '0'; // 当前 digit
String mapping = mappings[digit - 2]; // 映射
// 循环当前的字符
for (int i = 0; i < mapping.length(); i++) { // 注意从 0 开始
path.append(mapping.charAt(i));
// 回溯的时候,需要到下一个数字
backtrack(res, digits, path, ix + 1); // 递进到下一个 digit
path.deleteCharAt(path.length() - 1); // 回溯
}
}
效果
0ms 击败 100.00%