leetcode每日一题系列-「构造矩形」-「模拟」-「模拟+双指针」

217 阅读2分钟

leetcode-492-构造矩形

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

[题目描述]

作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:

  1. 你设计的矩形页面必须等于给定的目标面积。

  2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。

  3. 长度 L 和宽度 W 之间的差距应当尽可能小。 你需要按顺序输出你设计的页面的长度 L 和宽度 W。

示例:

输入: 4
输出: [2, 2]
解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。
但是根据要求2[1,4] 不符合要求; 根据要求3[2,2][4,1] 更能符合要求. 所以输出长度 L2, 宽度 W2

说明:

  • 给定的面积不大于 10,000,000 且为正整数。
  • 你设计的页面的长度和宽度必须都是正整数。

思路一:简单模拟

  • 我刚开始想的思路想复杂了
  • 直接遍历查找即可
  • 一个循环查找到满足条件的值即可
 public int[] constructRectangle(int area) {
            for (int i = (int)(Math.sqrt(area)); ;i--) {
                if (area % i == 0) return new int[]{area / i, i};
            }
        }
  • 时间复杂度O(n\sqrt{n})
  • 空间复杂度O(1)

思路二:模拟+双指针

  • 通过pow函数求得area\sqrt{area}
  • 然后两个指针从这个值开始左右移动
public int[] constructRectangle(int area) {
     //面积<=1的时候直接拿area返回即可
     if (area <= 1) {
         return new int[]{area, area};
     }
     //二分找到area的根号值
     //然后移动右指针即可
     int mid = (int) Math.pow((double) area, 0.5);
     int l = mid, r = mid;
     while (l > 0) {
         while (l * r <= area) {
             if (l * r == area) return new int[]{r, l};
             r++;
         }
         l--;
         r = l;
     }
     return null;
 }
  • 时间复杂度O(n)
  • 空间复杂度O(1)