leetcode 热题100道Day04

48 阅读1分钟

leetcode 热题100道Day04

合并区间

new 一个新数组,长度是intervals 最大值的两倍,把intervals范围内的数*2填入数组 【避免出现[1,3][4,5],但3和4中间是未覆盖部分,转化为[2,6][8,10],6和8就不连续了】

class Solution {
    public int[][] merge(int[][] intervals) {
            int len = 0;
            for(int[] arr : intervals){
                if(arr[0] > len) len = arr[0];
                if(arr[1] > len) len = arr[1];
            }
            // new 一个新数组,长度是intervals 最大值的两倍,把intervals范围内的数*2填入数组
            // 【避免出现[1,3][4,5],3和4中间是未覆盖部分,转化为[2,6][8,10],6和8不连续】
            int[] data = new int[(len+1)*2];
            for(int[] arr : intervals){
                for(int i = arr[0]*2;i <= arr[1]*2;i++){
                    data[i] = 1;
                }
            }
            List<int[]> res = new ArrayList<>();
            for(int i = 0;i < data.length;i++){
                if(data[i] == 1){   // 如果连续为1,则肯定是覆盖后的范围
                    int start = i/2;
                    while(i < data.length && data[i] == 1){
                        i++;
                    }
                    int end = (i-1)/2;
                    res.add(new int[]{start, end});
                }
            }
            return res.toArray(new int[res.size()][2]);
    }
}

排序链表

优先队列排序

class Solution {
    public ListNode sortList(ListNode head) {
                PriorityQueue<ListNode>heap = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
        ListNode node = head;
        while (node != null){
            ListNode temp = node.next;
            node.next = null;
            heap.add(node);
            node = temp;
        }
        head = heap.poll();
        node = head;
        while (!heap.isEmpty()){
            node.next = heap.poll();
            node = node.next;
        }
        return head;
        

    }
}