23. 合并K个排序链表

使用优先队列进行解决前k问题。

1. 合并 k 个排序链表,返回合并后的排序链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists.length==0) return null;
        // 这个函数传入的是包含多个有序链表的头结点
        //优先队列首先要给定一个排序规则
        //使用优先队列,优先队列的特点是,对头出队列
        PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
            @Override
            public int compare(ListNode node1, ListNode node2) {
                //升序
                return node1.val - node2.val;
            }
        });
        //将每次出队列的结点进行串联成新的链表
        ListNode dummy = new ListNode(0);
        ListNode temp = dummy;
        for (ListNode listNode : lists) {
            if (listNode != null) queue.add(listNode);
        }
        while(!queue.isEmpty()){
            temp.next = queue.poll();
            temp =  temp.next;
            if(temp.next!=null) queue.add(temp.next);
        }
        return dummy.next;
    }
}

2. 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
思路:

  • 先使用map统计数组中所有元素的次数。
  • 使用优先队列进行得到频率的前k元素。
class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer> res = new ArrayList<>();
        Map<Integer, Integer> temp = new HashMap<>();
        temp = frequncy(nums);
        //System.out.println(temp);
        PriorityQueue<Map.Entry<Integer, Integer>> queue =  new PriorityQueue<>(
                new Comparator<Map.Entry<Integer, Integer>>() {
                    @Override
                    public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                        return o2.getValue()-o1.getValue();
                    }
                });
        for (Map.Entry<Integer, Integer> entry:
             temp.entrySet()) {
            queue.add(entry);
        }
        for (int i=0;i<k;i++){
           res.add(queue.poll().getKey());
        }
        return res;
    }
    public static Map<Integer, Integer>  frequncy(int[] nums){
        Map<Integer, Integer> res = new HashMap<>();
        for (Integer i:
             nums) {
            if(res.containsKey(i)){
               res.put(i, res.get(i)+1) ;
            }else{
                res.put(i, 1);
            }
        }
        return res;
    }
}

你可能感兴趣的:(leetcode题解)