You are given an array rectangles
where rectangles[i] = [li, wi]
represents the ith
rectangle of length li
and width wi
.
You can cut the ith
rectangle to form a square with a side length of k
if both k <= li
and k <= wi
. For example, if you have a rectangle [4,6]
, you can cut it to get a square with a side length of at most 4
.
Let maxLen
be the side length of the largest square you can obtain from any of the given rectangles.
Return the number of rectangles that can make a square with a side length of maxLen
.
Example 1:
Input: rectangles = [[5,8],[3,9],[5,12],[16,5]] Output: 3 Explanation: The largest squares you can get from each rectangle are of lengths [5,3,5,5]. The largest possible square is of length 5, and you can get it out of 3 rectangles.
Example 2:
Input: rectangles = [[2,3],[3,7],[4,3],[3,7]] Output: 3
Constraints:
1 <= rectangles.length <= 1000
rectangles[i].length == 2
1 <= li, wi <= 109
li != wi
The problem asks to find the number of rectangles that can form the largest possible square. The largest square from a rectangle [l, w]
has a side length of min(l, w)
. The solution involves finding the maximum of these minimum side lengths across all rectangles and then counting how many rectangles can produce a square of that maximum side length.
Initialization: Initialize two variables:
maxLen
: To store the maximum side length of a square found so far (initialized to 0).count
: To store the number of rectangles that can form a square with maxLen
(initialized to 0).Iteration: Iterate through each rectangle [l, w]
in the rectangles
array:
sideLen = min(l, w)
. This represents the maximum side length of a square that can be formed from the current rectangle.Comparison and Update:
sideLen > maxLen
, it means we've found a larger square. Update maxLen
to sideLen
and reset count
to 1 (only one rectangle so far has this maximum side length).sideLen == maxLen
, it means we've found another rectangle that can form a square of the current maximum size. Increment count
by 1.Return: After iterating through all rectangles, return count
.
def countGoodRectangles(rectangles):
max_len = 0
count = 0
for l, w in rectangles:
side_len = min(l, w)
if side_len > max_len:
max_len = side_len
count = 1 # Reset count for the new max
elif side_len == max_len:
count += 1
return count
class Solution {
public int countGoodRectangles(int[][] rectangles) {
int maxLen = 0;
int count = 0;
for (int[] rect : rectangles) {
int sideLen = Math.min(rect[0], rect[1]);
if (sideLen > maxLen) {
maxLen = sideLen;
count = 1;
} else if (sideLen == maxLen) {
count++;
}
}
return count;
}
}
class Solution {
public:
int countGoodRectangles(vector<vector<int>>& rectangles) {
int maxLen = 0;
int count = 0;
for (const auto& rect : rectangles) {
int sideLen = min(rect[0], rect[1]);
if (sideLen > maxLen) {
maxLen = sideLen;
count = 1;
} else if (sideLen == maxLen) {
count++;
}
}
return count;
}
};
The other languages (Go, TypeScript, etc.) would follow a very similar structure, maintaining the same time and space complexity. The core logic remains consistent across all implementations.