56. 合并区间

题目:

给出一个区间的集合,请合并所有重叠的区间。

 

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: intervals = [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。

提示:

  • intervals[i][0] <= intervals[i][1]

 

代码:

// Arrays.sort(intervals, new Comparator<int[]>()          比较的更好办法
//{ public int compare(int[] interval1, int[] interval2)
//{ return interval1[0] - interval2[0]; } });
复制代码
 1 class Solution {
 2     public int[][] merge(int[][] intervals) {
 3        var arraylist=new ArrayList();
 4        int k=0;
 5        //先按照[i][0]排序       
 6        for(int i=intervals.length-1;i>=0;--i){
 7            boolean b=false;
 8            for(int j=1;j<=i;++j){
 9                if(intervals[j][0]<intervals[j-1][0]){
10                    //swap
11                    k=intervals[j][0];
12                    intervals[j][0]=intervals[j-1][0];
13                    intervals[j-1][0]=k;
14                 
15                    k=intervals[j][1];
16                    intervals[j][1]=intervals[j-1][1];
17                    intervals[j-1][1]=k;
18                    b=true;
19                }
20            }
21            if(!b){break;}
22        }
23        
24        k=0;
25        for(int i=0;i<intervals.length;){
26            int j=i+1;
27            while(j<intervals.length){
28                //[i][1]与[i+1][0],[i+1][1],有三种情况
29                if(intervals[i][1]>=intervals[j][0]&&intervals[i][1]<=intervals[j][1]){
30                    intervals[i][1]=intervals[j][1];
31                       ++j;
32                       continue;                   
33                }
34                if(intervals[i][1]<intervals[j][0]){break;}
35                if(intervals[i][1]>intervals[j][1]){++j;}
36            }
37                   intervals[k][0]= intervals[i][0];
38                    intervals[k][1]= intervals[i][1];
39                    i=j;
40                    ++k;
41            }
42         return Arrays.copyOfRange(intervals,0,k);
43        
44     }
45 }
复制代码

 

 

代码2:  //更简洁

复制代码
 1 class Solution {
 2     public int[][] merge(int[][] intervals) {
 3         if (intervals.length == 0) {
 4             return new int[0][2];
 5         }
 6         Arrays.sort(intervals, new Comparator<int[]>() {
 7             public int compare(int[] interval1, int[] interval2) {
 8                 return interval1[0] - interval2[0];
 9             }
10         });
11         List<int[]> merged = new ArrayList<int[]>();
12         for (int i = 0; i < intervals.length; ++i) {
13             int L = intervals[i][0], R = intervals[i][1];
14             if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
15                 merged.add(new int[]{L, R});
16             } else {
17                 merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
18             }
19         }
20         return merged.toArray(new int[merged.size()][]);
21     }
22 }
复制代码

 

posted @   堤苏白  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示