首页 > 其他分享 >LeetCode题练习与总结:构造矩形--492

LeetCode题练习与总结:构造矩形--492

时间:2024-12-24 23:32:06浏览次数:8  
标签:area -- 复杂度 int 宽度 长度 平方根 LeetCode 492

一、题目描述

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

  1. 你设计的矩形页面必须等于给定的目标面积。
  2. 宽度 W 不应大于长度 L ,换言之,要求 L >= W
  3. 长度 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 <= 10^7

二、解题思路

  1. 首先,找到给定面积 area 的平方根,并向下取整,得到一个初始宽度 w。这是因为当宽度接近长度的平方根时,长度和宽度的差距会最小。

  2. 从 w 开始,向下遍历,寻找能整除 area 的宽度 w,同时计算对应的长度 l = area / w

  3. 在遍历过程中,一旦找到满足条件的宽度 w,则立即返回长度 l 和宽度 w,因为这是当前遍历到的最接近平方根的宽度,长度和宽度的差距最小。

  4. 如果遍历到 w = 1 时,说明 area 是一个质数或者 area 本身就是最小宽度,此时返回 area 作为长度,1 作为宽度。

三、具体代码

class Solution {
    public int[] constructRectangle(int area) {
        // 计算初始宽度
        int w = (int) Math.sqrt(area);
        
        // 从平方根开始向下遍历,寻找合适的宽度
        while (area % w != 0) {
            w--;
        }
        
        // 计算对应的长度
        int l = area / w;
        
        // 返回长度和宽度
        return new int[]{l, w};
    }
}

这段代码首先计算了面积的平方根作为初始宽度,然后通过循环找到了能够整除面积的最接近平方根的宽度,最后返回了对应的长度和宽度。这样就能保证长度和宽度的差距尽可能小。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 计算平方根的时间复杂度:Math.sqrt(area) 是一个数学运算,其时间复杂度可以认为是 O(1),因为计算平方根的时间通常与输入值的大小无关,是一个常数时间的操作。

  • 循环遍历寻找合适宽度的时间复杂度:在最坏的情况下,当 area 是一个质数时,循环将一直执行直到 w 为 1。在这种情况下,循环将执行大约 sqrt(area) 次。因此,循环的时间复杂度是 O(sqrt(area))。

综上所述,整个 constructRectangle 方法的时间复杂度是 O(sqrt(area)),因为这是整个方法中最耗时的操作。

2. 空间复杂度
  • 常量空间:方法中使用了几个基本类型的变量(areawl),这些变量占用的空间不随输入值的大小而变化,因此这部分的空间复杂度是 O(1)。

  • 返回数组:返回了一个大小为 2 的数组,这个数组的大小也是固定的,不随输入值的大小而变化,因此这部分的空间复杂度也是 O(1)。

综合以上分析,整个 constructRectangle 方法的空间复杂度是 O(1),因为它使用了固定数量的额外空间。

五、总结知识点

  • Java 类定义

    • class 关键字用于定义一个类。
    • 类名 Solution 表示这是一个解决方案类。
  • 方法定义

    • public 关键字表示方法可以被外部访问。
    • int[] 表示方法返回一个整数数组。
    • 方法名 constructRectangle 表示该方法用于构造矩形。
    • 参数 int area 表示方法接收一个整数类型的参数 area
  • 数学运算

    • Math.sqrt() 方法用于计算一个数的平方根。
    • (int) 是类型转换,将 double 类型的平方根结果转换为 int 类型。
  • 循环控制

    • while 循环用于在满足条件时重复执行代码块。
    • area % w != 0 是循环的终止条件,表示当 area 不能被 w 整除时继续循环。
  • 算术运算

    • % 是取模运算符,用于计算余数。
    • / 是除法运算符,用于计算商。
  • 数组创建和初始化

    • new int[]{l, w} 创建并初始化一个包含两个元素的整数数组。
  • 返回语句

    • return 关键字用于从方法中返回一个值。
  • 基本数据类型

    • int 是 Java 中的基本数据类型,用于表示整数。
  • 逻辑运算

    • != 是不等于运算符,用于比较两个值是否不相等。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:area,--,复杂度,int,宽度,长度,平方根,LeetCode,492
From: https://blog.csdn.net/weixin_62860386/article/details/144679553

相关文章

  • GNU Make中CPPFLAGS和CXXFLAGS之间的区别
    GNUMake是一个流行的构建工具,用于编译和链接源代码。在GNUMake中,CPPFLAGS和CXXFLAGS都是用于指定编译器选项的变量。它们之间的主要区别在于它们分别适用于C和C++编译器。1、CPPFLAGS是预处理器标志(CPreProcessorFlags)的缩写,它们用于指定C预处理器(cpp)的选项。预......
  • JAVA期末通讯录
    写了挺久的,来CSDN记录一下应用软件:mysql,idea--------------------------------------------------------第一步:连接数据库直接去哔哩哔哩上面找mysql下载,下载完了之后我自身没有配什么环境,直接找的mysql怎么跟idea连接视频先用idea把mysql连接了之后再去看的mysql......
  • Linux 下 alsa 库录音并保存为 WAV 格式
    麦克风列表:[jn@jnbuild]$arecord-l****ListofCAPTUREHardwareDevices****card0:AudioPCI[EnsoniqAudioPCI],device0:ES1371/1[ES1371DAC2/ADC]Subdevices:1/1Subdevice#0:subdevice#0card1:Camera[2KUSBCamera],device0:USBAudio[USBA......
  • A5-1密码算法C语言实现
    #include<iostream>usingnamespacestd;boolx1[19]={0};//用于LFSR_1的向量boolx2[22]={0};//用于LFSR_2的向量boolx3[23]={0};//用于LFSR_3的向量boolkey[......
  • docker 构建最小镜像 - 2MB 不到
    @目录1.编译code2.编写Dockerfile3.构建镜像4.运行起来5.总结1.编译coderoot@jn:/home/jn/Desktop/Docker#cathello.gopackagemainimport("fmt""time")funcmain(){for{fmt.Println("hello~")......
  • Java多态--上转型对象
    Java多态概念实现方式上转型对象概念多态:面向对象的三大特性之一多态一句话概括就是,一个类下面的不同子类的实例,对同一个参数输入,得到不同的输出举例:动物类下的小猫、小狗,两只动物分别拍一下,小猫输出“喵喵喵”,小狗输出“汪汪汪”。实现方式多态的方式:类的继承,方......
  • 线程池前世今生及源码实现
    @目录⭐前序一、是什么(what)@功能构成二、为什么(why)三、何处(where)四、何时(when)五、谁(who)六、怎么样(how)@实践和性能调优策略@线程池源码(Code)[待补充]⭐前序本文讲什么:线程池的概念、工作原理、优势、实际应用中的使用场景和注意事项,以及一些最佳实践和性能调优策略......
  • Linux | scp指令基于WSL在Windows/Ubuntu系统间传输文件
    .背景在Windows系统里,使用WSL连接远程Linux(Ubuntu)服务器是如今一个很常见的操作流程(有利于WFH哈哈)。在使用远程机器的时候,通常需要将本地的文件上传、或将远程的文件下载。问题:如何优雅地将本地文件上传、或将远程的文件下载?.解决方案在网上搜索一番、同时问了GPT,找......
  • Java 变量和运算符
    Java变量和运算符1.变量(Variable)1.1何为变量1.2数据类型(DataTypes)1.2.1整型:byte、short、int、long1.2.2浮点类型:float、double1.2.3字符类型:char1.2.4布尔类型:boolean1.3变量的使用1.3.1步骤1:变量的声明1.3.2步骤2:变量的赋值1.4.基本数据类型变......
  • 简单记录下底部固定的样式并简单封装
    需求:需要在底部做个固定样式,添加备案等信息实现思路:1.定义文本,数组对象记录,循环遍历,有利于维护2.定义样式,固定定位+层级置顶3.抽离成组件复用js<scriptlang="ts"setup>constbottomInfoList=[{label:'关于我们',link:'user/aboutUs'},{label:'帮......