From 2944b9152086d15662f4fafb636f993a9b16378c Mon Sep 17 00:00:00 2001 From: Yuhao Ju Date: Sat, 17 Dec 2022 14:19:09 +0800 Subject: [PATCH] =?UTF-8?q?update=200435.=E6=97=A0=E9=87=8D=E5=8F=A0?= =?UTF-8?q?=E5=8C=BA=E9=97=B4=EF=BC=9A=E6=9B=B4=E6=96=B0=20java=20?= =?UTF-8?q?=E5=92=8C=20go=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0435.无重叠区间.md | 66 +++++++++++++++----------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md index 6ac29996..33f8c3f2 100644 --- a/problems/0435.无重叠区间.md +++ b/problems/0435.无重叠区间.md @@ -62,9 +62,9 @@ 每次取非交叉区间的时候,都是可右边界最小的来做分割点(这样留给下一个区间的空间就越大),所以第一条分割线就是区间1结束的位置。 -接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘已经是按照右边界排序的了**。 +接下来就是找大于区间1结束位置的区间,是从区间4开始。**那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了**。 -区间4结束之后,在找到区间6,所以一共记录非交叉区间的个数是三个。 +区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。 总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。 @@ -183,23 +183,19 @@ public: ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - Arrays.sort(intervals, (a, b) -> { - // 按照区间右边界升序排序 - return a[1] - b[1]; + Arrays.sort(intervals, (a,b)-> { + return Integer.compare(a[0],b[0]); }); - - int count = 0; - int edge = Integer.MIN_VALUE; - for (int i = 0; i < intervals.length; i++) { - // 若上一个区间的右边界小于当前区间的左边界,说明无交集 - if (edge <= intervals[i][0]) { - edge = intervals[i][1]; - } else { + int count = 1; + for(int i = 1;i < intervals.length;i++){ + if(intervals[i][0] < intervals[i-1][1]){ + intervals[i][1] = Math.min(intervals[i - 1][1], intervals[i][1]); + continue; + }else{ count++; - } + } } - - return count; + return intervals.length - count; } } ``` @@ -208,16 +204,15 @@ class Solution { ```java class Solution { public int eraseOverlapIntervals(int[][] intervals) { - - Arrays.sort(intervals,(a,b)->{ + Arrays.sort(intervals, (a,b)-> { return Integer.compare(a[0],b[0]); }); int remove = 0; int pre = intervals[0][1]; - for(int i=1;iintervals[i][0]) { + for(int i = 1; i < intervals.length; i++) { + if(pre > intervals[i][0]) { remove++; - pre = Math.min(pre,intervals[i][1]); + pre = Math.min(pre, intervals[i][1]); } else pre = intervals[i][1]; } @@ -242,27 +237,26 @@ class Solution: ``` ### Go -```golang +```go func eraseOverlapIntervals(intervals [][]int) int { - var flag int - //先排序 - sort.Slice(intervals,func(i,j int)bool{ - return intervals[i][0]intervals[i][0]{ - flag++ - intervals[i][1]=min(intervals[i-1][1],intervals[i][1])//由于是先排序的,所以,第一位是递增顺序,故只需要将临近两个元素的第二个值最小值更新到该元素的第二个值即可作之后的判断 + res := 1 + for i := 1; i < len(intervals); i++ { + if intervals[i][0] >= intervals[i-1][1] { + res++ + } else { + intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]) } } - return flag + return len(intervals) - res } -func min(a,b int)int{ - if a>b{ - return b +func min(a, b int) int { + if a < b { + return a } - return a + return b } ```