ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 391. 完美矩形

2021-11-16 16:03:50  阅读:191  来源: 互联网

标签:return int list 391 l2 l1 矩形 rectangles LeetCode


通过这题学习了一下扫描线。

有两种思路。

第一种是利用点的配对加上面积来判断,比较简单不需要扫描线。

另一种是利用边的匹配。把每个矩形拆成左右两条边。

这样我们排序之后就可以从左向右扫描。

每个纵轴必然对应着几段线段并且左右两边的合并后的线段是重合的。

 1 class Solution {
 2     public boolean isRectangleCover(int[][] rectangles) {
 3         int n = rectangles.length;
 4         int line[][] = new int[n * 2][4];
 5         int idx = 0;
 6         for(int i = 0; i < n; i++) {
 7             line[idx++] = new int[]{rectangles[i][0], rectangles[i][1], rectangles[i][3], 1};
 8             line[idx++] = new int[]{rectangles[i][2], rectangles[i][1], rectangles[i][3], -1};
 9         }
10         Arrays.sort(line, (o1, o2) -> {
11             if(o1[0] == o2[0])
12                 return o1[1] - o2[1];
13             return o1[0] - o2[0];
14         });
15         int r = 0;
16         List<int[]> l1 = new ArrayList<>();
17         List<int[]> l2 = new ArrayList<>();
18         for(int l = 0; l < n * 2;) {
19             while(r < 2 * n && line[r][0] == line[l][0])
20                 r++;
21             l1.clear();
22             l2.clear();
23             List<int[]> list;
24             for(int i = l; i < r; i++) {
25                 int[] cur = line[i];
26                 list = cur[3] == 1 ? l1 : l2;
27                 if(list.isEmpty())
28                     list.add(cur);
29                 else {
30                     int[] prev = list.get(list.size() - 1);
31                     if(prev[2] > cur[1])
32                         return false;
33                     else if(prev[2] == cur[1])
34                         prev[2] = cur[2];
35                     else 
36                         list.add(cur);
37                 }
38             }
39             if(l > 0 && r < 2 * n) {
40                 if(l1.size() != l2.size())
41                     return false;
42                 for(int i = 0; i < l1.size(); i++) {
43                     if(l1.get(i)[1] == l2.get(i)[1] && l1.get(i)[2] == l2.get(i)[2])
44                         continue;
45                     return false;
46                 }
47             } else
48                 if(l1.size() + l2.size() != 1)
49                     return false;
50             l = r;
51         }
52         return true;
53     }
54 }

 

标签:return,int,list,391,l2,l1,矩形,rectangles,LeetCode
来源: https://www.cnblogs.com/wuenze/p/15561593.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有