leetcode-492-Construct the Rectangle

Topic description:

For a web developer, it is very important to know how to design a web page's size. So, given a specific rectangular web page’s area, your job by now is to design a rectangular web page, whose length L and width W satisfy the following requirements:

1. The area of the rectangular web page you designed must equal to the given target area.

2. The width W should not be larger than the length L, which means L >= W.
3. The difference between length L and width W should be as small as possible.

You need to output the length L and the width W of the web page you designed in sequence.

 

Example:

Input: 4
Output: [2, 2]
Explanation: The target area is 4, and all the possible ways to construct it are [1,4], [2,2], [4,1].
But according to requirement 2, [1,4] is illegal; according to requirement 3,  [4,1] is not optimal compared to [2,2]. So the length L is 2, and the width W is 2.

 

Note:

  1. The given area won't exceed 10,000,000 and is a positive integer
  2. The web page's width and length you designed must be positive integers.

 

Function to be done:

vector<int> constructRectangle(int area) 

 

illustrate:

1. This problem is not difficult. Given a product, two factors are required to be output (the larger one is in the front and the smaller is in the back). The difference between the two factors should be as small as possible.

2. Seeing these constraints, our first choice is to take the square root, and then find a number that can be divided by the product near the value obtained by the square root.

code show as below:

    vector<int> constructRectangle(int area) 
    {
        int eu=ceil(sqrt(area));
        while(area%eu)
            i += 1 ;
        return {me,area/ me};
    }

The above code is accepted, measured 80ms, beats 27.85% of cpp submissions...

Is it that low? But I see that the code in the comment area uses the same method as me, why can they get 4ms...

 

3. Improvement:

After a careful comparison of the code in the comment area, they use eu to continuously decrease by one, while I use eu to continuously increase by one.

Because eu is small, it is easier to remove? For example, dividing 2889 by 11 is definitely better than dividing 2889 by 3.

So if you use the method of continuously subtracting 1 from eu, you can indeed save a lot of time for division, and the effect of the two is the same.

code show as below:

    vector<int> constructRectangle(int area) 
    {
        int eu=floor(sqrt(area));
        while(area%eu)
            i -= 1 ;
        return {area/ me, me};
    }

Measured 3ms, beats 98.48% of cpp submissions.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325082245&siteId=291194637