The Algorithm to Construct the Rectangle Given Its Area

  • 时间:2020-09-30 16:23:25
  • 分类:网络文摘
  • 阅读:121 次

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:
The given area won’t exceed 10,000,000 and is a positive integer
The web page’s width and length you designed must be positive integers.

Math Algorithm

To construct the optimal rectangle that its width and height difference is minimal, we can start from the square root of the area, and search in either directions incrementing or decrementing by one until width and height are both integers.

The edge case is when input area is smaller or equal to zero. The following bruteforce algorithm searches upwards:

1
2
3
4
5
6
7
8
9
10
class Solution {
    public int[] constructRectangle(int area) {
        if (area == 0) return new int[] {0, 0};
        int x = (int)Math.ceil(Math.sqrt(area));
        while (area % x != 0) {
            x ++;
        }
        return new int[] { x, area / x };
    }
}
class Solution {
    public int[] constructRectangle(int area) {
        if (area == 0) return new int[] {0, 0};
        int x = (int)Math.ceil(Math.sqrt(area));
        while (area % x != 0) {
            x ++;
        }
        return new int[] { x, area / x };
    }
}

And the following Java implementation is also accepted which searches downwards (in the other direction):

1
2
3
4
5
6
7
8
9
10
class Solution {
    public int[] constructRectangle(int area) {
        if (area == 0) return new int[] {0, 0};
        int x = (int)(Math.sqrt(area));
        while (area % x != 0) {
            x --;
        }
        return new int[] { area / x, x };
    }
}
class Solution {
    public int[] constructRectangle(int area) {
        if (area == 0) return new int[] {0, 0};
        int x = (int)(Math.sqrt(area));
        while (area % x != 0) {
            x --;
        }
        return new int[] { area / x, x };
    }
}

When input area is invalid (negative numbers), you could let the code throw exception (divide by zero) or throw exception by yourself, or simply return {-1, -1}. The following is also accepted, although a bit verbose.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
    public int[] constructRectangle(int area) {
        if (area == 0) return new int[] {0, 0};
        int x = (int)Math.sqrt(area);
        while (x <= area) {
            if (area % x == 0) {
                int min = Math.min(x, area / x);
                int max = Math.max(x, area / x);
                return new int[] { max, min };
            }
            x ++;
        }
        return new int[] { -1, -1 }; // should not reach here.
    }
}
class Solution {
    public int[] constructRectangle(int area) {
        if (area == 0) return new int[] {0, 0};
        int x = (int)Math.sqrt(area);
        while (x <= area) {
            if (area % x == 0) {
                int min = Math.min(x, area / x);
                int max = Math.max(x, area / x);
                return new int[] { max, min };
            }
            x ++;
        }
        return new int[] { -1, -1 }; // should not reach here.
    }
}

The complexity is O(Sqrt(N)) time, and O(1) constant space.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
红枣维生素含量高 喝大枣水养肝排毒  黑木耳营养丰富对健康有五大好处  香蕉和橘子能起到解毒护肝的作用  吃葡萄、喝葡萄酒能帮助调节性功能  绿茶、红茶、青茶、黑茶、白茶和黄茶  奶茶多添加奶精 长期食用会引发心脏病  奶茶调查:街头奶茶店调香味多用奶精  适合秋天食用的养肺食谱可滋阴润肺  哪些食物可以起到止咳润肺的作用  食物的禁忌:中医如何区分食物的寒热性 
评论列表
添加评论