LeetCode构造矩形问题:无法理解代码中的判断逻辑求助
LeetCode「构造矩形」解法逻辑拆解
1. 为啥(area/w)*w == area不是永远成立?
这里用的是Java的整数除法,两个int相除会直接砍掉小数部分。只有当w是area的正约数时,area除以w才没有余数,此时area/w的结果乘回w才等于原area。如果w不是约数,area/w会舍去余数,再乘w得到的数肯定比area小,条件自然不成立。
举个例子:area=26,w=5时,26/5等于5(不是5.2),5*5=25,显然不等于26,条件就不满足。
2. 循环是怎么跑起来的?
循环从w=(int)Math.sqrt(area)开始,每次w减1,直到找到第一个符合条件的w:
- 从平方根开始找的核心原因:要让长L和宽W的差值最小,W得尽可能接近area的平方根(因为L=area/W,W越接近平方根,L和W的差距就越小)。
- 一旦找到第一个能整除area的w,直接返回
[area/w, w]就行——因为这是最大的可能w(最接近平方根),对应的L和W差值肯定是最小的。
3. 拿area=26来一步步看
- sqrt(26)大概是5.099,转成int后w从5开始:
- w=5:
(26/5)*5=5*5=25≠26,不满足,w减到4。 - w=4:
(26/4)*4=6*4=24≠26,不满足,w减到3。 - w=3:
(26/3)*3=8*3=24≠26,不满足,w减到2。 - w=2:
(26/2)*2=13*2=26,刚好等于area,满足条件,直接返回[13,2]。这就是正确结果,因为13和2的差是11,比另一组可能的[26,1]差25要小得多。
- w=5:
额外提一句
代码最后返回空数组只是个形式,因为area是正整数,w最后一定会减到1,而1肯定能整除任何正整数,所以必然会在w=1时返回[area,1],根本走不到返回空数组那一步。
内容的提问来源于stack exchange,提问作者Amanda James
相关产品推荐
相关产品推荐

