电话号码的字母组合(哈希表、字符串)
给定一个仅包含数字 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'] 的一个数字。
解答:
class Solution {
public List<String> letterCombinations(String digits) {
Character[][] letters = { {}, {}, { 'a', 'b', 'c' }, { 'd', 'e', 'f' }, { 'g', 'h', 'i' }, { 'j', 'k', 'l' },
{ 'm', 'n', 'o' }, { 'p', 'q', 'r', 's' }, { 't', 'u', 'v' }, { 'w', 'x', 'y', 'z' }, };
List<List<Character>> combinations = new ArrayList<>();
for (int i = 0; i < digits.length(); i++) {
Character d = digits.charAt(i);
int index = Character.getNumericValue(d);
Character[] letter = letters[index];
System.out.println(d);
if (i == 0) {
for (int j = 0; j < letter.length; j++) {
List<Character> c = new ArrayList<>();
c.add(letter[j]);
combinations.add(c);
}
} else {
List<List<Character>> added = new ArrayList<>();
for (int j = 0; j < combinations.size(); j++) {
List<Character> c = combinations.get(j);
List<Character> origin_c = new ArrayList<>(c);
for (int k = 0; k < letter.length; k++) {
Character l = letter[k];
if (k == 0) {
c.add(l);
} else {
List<Character> new_c = new ArrayList<>(origin_c);
new_c.add(l);
added.add(new_c);
}
}
}
combinations.addAll(added);
}
}
List<String> output = new ArrayList<>();
for (int i = 0; i < combinations.size(); i++) {
List<Character> c = combinations.get(i);
StringBuilder sb = new StringBuilder();
for (Character l : c) {
sb.append(l);
}
output.add(sb.toString());
}
return output;
}
}
合并两个有序数组(数组、双指针)
给你两个有序整数数组 nums1_ 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 _的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
提示:
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -109 <= nums1[i], nums2[i] <= 109
解答:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
for (int i = 0; i < n; i++) {
nums1[m] = nums2[i];
m++;
}
int temp = 0;
for (int i = 0; i < m; i++) {
for (int j = i; j < m; j++) {
if (nums1[i] > nums1[j]) {
temp = nums1[j];
nums1[j] = nums1[i];
nums1[i] = temp;
}
}
}
}
}
合并K个升序链表(链表、分治)
给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
- k == lists.length
- 0 <= k <= 10^4
- 0 <= lists[i].length <= 500
- -10^4 <= lists[i][j] <= 10^4
- lists[i] 按 升序 排列
- lists[i].length 的总和不超过 10^4
以下程序实现了这一功能,请你填补空白处内容:
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0)
return null;
return merge(lists, 0, lists.length - 1);
}
public ListNode merge(ListNode[] lists, int low, int high) {
if (high - low == 0)
return lists[low];
else if (high - low == 1)
return mergeTwoLists(lists[low], lists[high]);
else {
int mid = (low + high) / 2;
_____________________________;
return mergeTwoLists(tmp1, tmp2);
}
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode();
ListNode p = head;
while (l1 != null && l2 != null) {
if (l1.val > l2.val) {
p.next = l2;
l2 = l2.next;
p = p.next;
} else {
p.next = l1;
l1 = l1.next;
p = p.next;
}
}
if (l1 != null)
p.next = l1;
if (l2 != null)
p.next = l2;
return head.next;
}
}
解答:
ListNode tmp1 = merge(lists, low, mid);
ListNode tmp2 = merge(lists, mid + 1, high);
本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨💻
保持热爱,奔赴下一场山海。🏃🏃🏃
















