In this article I would be going over a solution to leetcode problem 492: Construct the Rectangle,
Two solutions were developed and I will be walking you through them
Solutuion 1
The function accepts a parameter area, in this example we would go with 16
area = 16
Next we create our answer dictionary variable to hold the factors of the target area
ad = {}
Also setup a temp list with maximum and minimum values of infinity
temp = [ float('inf'), float('-inf')]
First we wanna iterate over from 1 till the square root of the target area + 1 to avoid duplicates
for 1,2...sqrt(16)+1 --> 5
For every iteration, if we find a factor of that number then we want to save it to the answer dictionary
# 16/1
# 16/2
# 16/3
# 16/4
ad = {'1':'16', '2':'8', '4':'4'}
Now we can iterate through the answer dictionary to select the best length and width combination with the lowest absolute difference
for k,v in ad:
if abs(k-v) < abs(temp[0]-temp[1])
temp[0], temp[1] = min(k, v), max(k,v)
return temp
At the end of this process we have the answer in temp list
Code Below
import math
class Solution:
def constructRectangle(self, area: int) -> List[int]:
answer_dict = {}
temp = [float('inf'), float('-inf')]
for n in range(1, int(math.sqrt(area))+1):
if area%n == 0:
answer_dict[n] = area // n
for k, v in answer_dict.items():
if abs(temp[0] - temp[1]) > abs(k-v):
temp[0], temp[1] = max(k, v), min(k, v)
return temp
The first solution was long and it could be made a lot simpler
This second solution makes use of one list to keep the prospective lengths and breadths
Easy to understand
class Solution:
def constructRectangle(self, area: int) -> List[int]:
ans = []
for i in range(1, int(sqrt(area))+1):
j = area // i
if i * j == area:
if i <= j:
ans.append([max(i,j), min(i,j)])
return ans[-1]
A little task for the readers, what is the time and space complexities of both solutions
Also do let me know if you have a better solution, or any improvements to be made
Happy Cocding :)
Top comments (0)