构造矩形
难度:
标签:
题目描述
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:
- 你设计的矩形页面必须等于给定的目标面积。
- 宽度
W
不应大于长度L
,换言之,要求L >= W
。 - 长度
L
和宽度W
之间的差距应当尽可能小。
返回一个 数组 [L, W]
,其中 L
和 W
是你按照顺序设计的网页的长度和宽度。
示例1:
输入: 4 输出: [2, 2] 解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。 但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。
示例 2:
输入: area = 37 输出: [37,1]
示例 3:
输入: area = 122122 输出: [427,286]
提示:
1 <= area <= 107
代码结果
运行时间: 35 ms, 内存: 15.9 MB
/*
* 思路:
* 1. 使用Java Stream API的IntStream生成从sqrt(area)到1的数字流。
* 2. 使用filter筛选出能整除面积的因数W,并计算对应的L。
* 3. 寻找第一个满足条件的L和W。
*/
import java.util.stream.IntStream;
public class Solution {
public int[] constructRectangle(int area) {
return IntStream.rangeClosed(1, (int) Math.sqrt(area))
.filter(W -> area % W == 0) // 筛选出W
.mapToObj(W -> new int[]{area / W, W}) // 映射为[L, W]对
.filter(pair -> pair[0] >= pair[1]) // 过滤掉L < W的情况
.findFirst() // 寻找第一个满足条件的
.orElse(new int[]{0, 0}); // 理论上不会执行到这里
}
}
解释
方法:
该题解的思路是从 area 的平方根开始,逐渐递减找到可以整除 area 的因子。这样可以保证找到的两个因子之差是最小的,且第一个因子大于等于第二个因子。
时间复杂度:
O(sqrt(n))
空间复杂度:
O(1)
代码细节讲解
🦆
为什么从area的平方根开始查找因子,而不是从1或area本身开始查找?
▷🦆
在确定因子mid时,为什么选择递减mid的方式,而不是递增查找从1到sqrt(area)的因子?
▷🦆
你如何证明从平方根开始递减查找因子,并在找到第一个因子时停止,这种方法能保证L和W之间的差距尽可能小?
▷🦆
在某些特定情况下,如area为质数时,这种算法的效率如何?会不会导致必须从sqrt(area)递减到1?
▷