“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
22. 括号生成
一、题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
二、思路分析:
- 回溯
- 终止条件 : 左括号剩余0个,右括号剩余0个
- 已经做出的选择 记录String 字符串
- 可以选择的路径 : 左右括号剩余的数量不为0, 有效性 : 已经做出的选择中右括号如果多余左括号的数量时不合法
三、AC 代码:
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
dfs(n,n,new StringBuilder(),ans);
return ans;
}
void dfs(int left, int right, StringBuilder path, List<String> ans){
if(left == 0 && right == 0){
ans.add(path.toString());
return;
}
if(right < left) return;
if(left < 0 || right < 0) return;
path.append("(");
dfs(left - 1, right, path , ans);
path.deleteCharAt(path.length() - 1);
path.append(")");
dfs(left, right - 1, path ,ans);
path.deleteCharAt(path.length() - 1);
}
}
23. 合并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 = [[]] 输出:[]
二、思路分析:
- 归并, 当数组长度大于1时, 合并其中的两个链表
- 优先队列, 将链表头添加到队列中, 当队列不为空时循环,弹出当前值最小的节点,其次后续节点不为空时,加入队列
三、AC 代码:
/**
* Definition for singly-linked list.
* 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 == null || lists.length == 0) return null;
PriorityQueue<ListNode> queue = new PriorityQueue<>(new Comparator<ListNode>(){
@Override
public int compare(ListNode l1, ListNode l2){
return l1.val - l2.val;
}
});
for(ListNode node : lists){
if(node == null) continue;
queue.offer(node);
}
ListNode ans = new ListNode(-1);
ListNode cur = ans;
while(!queue.isEmpty()){
ListNode node = queue.poll();
if(node.next != null) queue.offer(node.next);
cur.next = node;
cur = cur.next;
}
return ans.next;
}
}