
题目描述
1725. 可以形成最大正方形的矩形数目
给你一个数组 rectangles
,其中 rectangles[i] = [li, wi]
表示第 i
个矩形的长度为 li
、宽度为 wi
。
如果存在 k
同时满足 k <= li
和 k <= wi
,就可以将第 i
个矩形切成边长为 k
的正方形。例如,矩形 [4,6]
可以切成边长最大为 4
的正方形。
设 maxLen
为可以从矩形数组 rectangles
切分得到的 最大正方形 的边长。
请你统计有多少个矩形能够切出边长为 maxLen
的正方形,并返回矩形 数目 。
示例 1:
1 2 3 4
| 输入:rectangles = [[5,8],[3,9],[5,12],[16,5]] 输出:3 解释:能从每个矩形中切出的最大正方形边长分别是 [5,3,5,5] 。 最大正方形的边长为 5 ,可以由 3 个矩形切分得到。
|
示例 2:
1 2
| 输入:rectangles = [[2,3],[3,7],[4,3],[3,7]] 输出:3
|
提示:
1 <= rectangles.length <= 1000
rectangles[i].length == 2
1 <= li, wi <= 109
li != wi
解题思路
- 定义一个一维数组a,找出二维数组rectangles中每个一维数组中的最小值,将其放到a中。
- 使用冒泡排序数组a。
- 统计排序好后的数组a中最大值有几个。
代码实现
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public int countGoodRectangles(int[][] rectangles) { int[] a = new int[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { a[i] = Math.min(rectangles[i][0], rectangles[i][1]); } sort(a); int max = a[0]; int result = 1; for (int i = 1; i < a.length; i++) { if (a[i] == max) { result++; } else { break; } } return result; } private void sort(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = i + 1; j < arr.length; j++) { if (arr[i] < arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } }
|
更优解
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Solution { public int countGoodRectangles(int[][] rectangles) { int max = 0, ans = 0; for (int[] r : rectangles) { int cur = Math.min(r[0], r[1]); if (cur == max) ans++; else if (cur > max) { max = cur; ans = 1; } } return ans; } }
|