电话号码的字母组合(哈希表、字符串)

给定一个仅包含数字 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);

本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃