技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。
目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。
初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。
如果有任何问题可以在文章后评论或者私信给我。
我会持续分享下去,敬请您的关注。
LeetCode 492. 构造矩形(Construct the Rectangle)
问题描述:
作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:
- 你设计的矩形页面必须等于给定的目标面积。
- 宽度 W 不应大于长度 L,换言之,要求 L >= W 。
- 长度 L 和宽度 W 之间的差距应当尽可能小。
你需要按顺序输出你设计的页面的长度 L 和宽度 W。
注:
- 给定的面积不大于 10,000,000 且为正整数。
- 你设计的页面的长度和宽度必须都是正整数。
示例:
C语言实现:
这道题的最核心问题是长度和宽度的差要最小。那么,什么时候它们的差最小?显然有:
- 如果长是area宽是1的时候,这个时候差是最大的;
- 如果area的算术平方根恰好是整数,那么这时候它们的差是0;
- 如果area的算术平方根不是整数,那么距离area算术平方根最近的一对长宽值,一定是差最小的一对。
基于这个原理,我们知道要先求出area的平方根,库中有现成的函数可以直接拿来用,不建议自己实现。
最终代码如下:
我们求得了area的算术平方根后,这个值是一个双精度浮点数,要转换成整形。这个时候会出现如下情况:
- area算术平方根刚刚好就是整数,强制转换不丢失精度;
- area算术平方根是一个小数,强制转换丢失精度;
我们要注意第二种情况,强制转换成int,这个操作相当与一个下取整操作,只保留整数,而丢弃后面的小数部分。所以转换后的q*q可能不等于area。
代码第9行,不管q的值是多少,我们可以判断的是它一定是离area的算术平方根最近的一个整数,这一行的作用就是,按照我们上面说的逻辑,要找到一对整数值距离算术平方根最近,我们意识中会认为可以向左找,也可以向右找。事实是,我们应该向左,而不是向右,因为上面说了强制转换是下取整,意味着q是小于等于area的算术平方根的,那么我们应该按照这个方向去找,虽然向右也能找到,但是你需要额外判断最终的q和area/q哪个大,因为返回值有要求,值大的要放在前面。大家可以试试area是分别是2和21的时候的情况。
Java语言的实现:
Java 的实现和C语言的实现一致,不再撰述。
代码如下:
python语言的实现:
python 的实现和C语言的实现一致,不再撰述。
代码如下: