🔥 LeetCode 热题 HOT 100 : 22 && 23

223 阅读1分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

22. 括号生成

一、题目描述:

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

 

示例 1:

输入:n = 3

输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1

输出:["()"]  

二、思路分析:

  • 回溯
  1. 终止条件 : 左括号剩余0个,右括号剩余0个
  2. 已经做出的选择 记录String 字符串
  3. 可以选择的路径 : 左右括号剩余的数量不为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;
    }
}