美文网首页
排序| Leetcode 56

排序| Leetcode 56

作者: 三更冷 | 来源:发表于2023-03-04 12:20 被阅读0次

    Leetcode 分类刷题 —— 排序类(Sort)

    1、题目

    Leetcode 56. Merge Intervals 合并区间

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

    2、思路

    按照区间的左端点排序,在排完序的列表中,判断区间是否重叠,如果重叠就合并,不重叠就添加到结果集。
    时间复杂度:排序的时间复杂度是O(nlogn),其中n是区间的个数。遍历的时间复杂度是O(n),

    3、代码

     class Solution {
        public int[][] merge(int[][] intervals) {
            int m = intervals.length;
            //先按左边界排序
            sorted(intervals,0,m-1);
            //然后逐步合并
            int j=0;  //j指向要与i做对比的最后一个区间的位置
            for(int i=1;i<m;i++) { //i依次向后取
                if(intervals[j][1]>=intervals[i][0]) { //两个区间有交叉
                    intervals[j][1]=Math.max(intervals[i][1],intervals[j][1]);
                } else { //两个区间没有交叉,把i位置的向前挪,填补前面数组的空白
                    j++;
                    intervals[j]=intervals[i];
                }
            }
            return Arrays.copyOf(intervals,j+1);
        }
        private void sorted(int[][] intervals,int left,int right) {
            //快速排序
            if (left>=right) {
                return;
            }
            int[] x = intervals[right];
            int index = left;
            for(int i=left;i<right;i++) {
                if(intervals[i][0]<x[0]) {
                    int[] temp = intervals[index];
                    intervals[index] = intervals[i];
                    intervals[i] = temp;
                    index++;
                }
            }
            intervals[right] = intervals[index];
            intervals[index] = x;
            sorted(intervals,left,index-1);
            sorted(intervals,index+1,right);
        }
    }
    

    首先,对输入的区间按照起始值进行升序排序,这样可以保证相邻的区间有可能重叠。
    然后,创建一个新的列表,用来存放合并后的区间。
    遍历排序后的区间,对于每个区间,判断它是否与列表中最后一个区间重叠。
    如果不重叠,说明它是一个新的区间,直接添加到列表中。
    如果重叠,说明它可以与列表中最后一个区间合并,更新列表中最后一个区间的终止值为两个区间的最大终止值。
    最后,将列表转换为二维数组并返回。

    class Solution {
        public int[][] merge(int[][] intervals) {
            // Sort the intervals by their start time
            Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
    
            // Create a list to store the merged intervals
            List<int[]> merged = new ArrayList<>();
    
            // Iterate over the intervals
            for (int[] interval : intervals) {
                // If the list of merged intervals is empty or if the current interval does not overlap with the previous interval, simply append it
                if (merged.isEmpty() || merged.get(merged.size() - 1)[1] < interval[0]) {
                    merged.add(interval);
                } else {
                    // Otherwise, there is overlap, so we merge the current and previous intervals
                    merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], interval[1]);
                }
            }
    
            // Convert the list to an array and return it
            return merged.toArray(new int[merged.size()][]);
        }
    }
    
    

    4、java.util.Arrays#sort

    • Arrays.sort()是一个静态方法,用于对数组进行排序,可以对基本类型或对象类型的数组进行排序。
    • Arrays.sort()的排序原理取决于数组的类型和大小。
    • 对于基本类型的数组,Arrays.sort()使用了双轴快速排序算法,它是快速排序的一种改进,可以更好地处理重复元素和不平衡的分割。
    • 对于对象类型的数组,Arrays.sort()使用了归并排序算法,它是一种稳定的排序算法,可以保持相等元素的相对顺序。
    • 当对象类型的数组较小(长度小于47)时,Arrays.sort()使用了插入排序算法,它是一种简单而高效的排序算法,适合小规模的数据。

    参考文章:
    https://leetcode.cn/problems/merge-intervals/solution/he-bing-qu-jian-by-leetcode-solution/
    Java的Arrays.sort()方法到底用的什么排序算法
    类似的区间题目:重叠区间、合并区间、插入区间

    相关文章

      网友评论

          本文标题:排序| Leetcode 56

          本文链接:https://www.haomeiwen.com/subject/lselldtx.html