{x}
blog image

Number Of Rectangles That Can Form The Largest Square

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

Solution Explanation:

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.

Approach:

  1. 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).
  2. Iteration: Iterate through each rectangle [l, w] in the rectangles array:

    • Calculate sideLen = min(l, w). This represents the maximum side length of a square that can be formed from the current rectangle.
  3. Comparison and Update:

    • If 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).
    • If sideLen == maxLen, it means we've found another rectangle that can form a square of the current maximum size. Increment count by 1.
  4. Return: After iterating through all rectangles, return count.

Time and Space Complexity:

  • Time Complexity: O(n), where n is the number of rectangles. We iterate through the array of rectangles once.
  • Space Complexity: O(1). We only use a few constant extra variables.

Code Implementation (Python):

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
 

Code Implementation (Java):

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;
    }
}

Code Implementation (C++):

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.