【LeetCode】478. 在圆内随机生成点

195 阅读1分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 0 < radius <= 108
    • -107 <= x_center, y_center <= 107
    • randPoint 最多被调用 3 * 104 次

二、思路分析:

我们读取本题,题目要求实现随机返回一个在圆内的坐标点的函数。函数对象初始化给出三个参数:

  • radius:圆的半径
  • x_center: 圆点的x坐标点
  • y_center: 圆点的y坐标点

我们一拿到题目,很容易想到使用随机函数random分别求出x,y的随机数

  • xx:[-(x_center+radius),x.center+radius]
  • yy: [-(y.center+radius),y_center+radius]

然而现实很残酷,一提交NG,果然今天的题没有那么简单,仔细思考一番,需要用上数学的方法。

本题是涉及到圆,那么大家还记高中时候的勾股定理吗?

  • 直角三角形中,两个直角边的平方加起来等于斜边的平方
  • a^2 + b^2 = c^2

image.png

  • 方法一:模拟法

通过勾股定理,我们可以求出坐标点到圆点的距离

  • 当距离d大于半径r时,则在圆外,不符合要求继续生成新坐标
  • 当距离d小于等于半径r时,则在圆内
  • 因为圆点的坐标是不固定的,则结果需要加上圆点的坐标点(x_center,y_center)

image.png

圆的面积 pir^2 ,正方形面积则为 4rr ,则出现在圆内的概率为P = pi/4 ≈1.274=O(1)

class Solution(object):

    def __init__(self, radius, x_center, y_center):
        """
        :type radius: float
        :type x_center: float
        :type y_center: float
        """
        self.radius = radius
        self.x_center = x_center
        self.y_center = y_center


    def randPoint(self):
  
        while True:

            xx,yy = random.uniform(-self.radius,self.radius), random.uniform(-self.radius,self.radius)

            if self.radius * self.radius >= xx * xx + yy * yy :

                return [self.x_center+xx,self.y_center+yy]
            

三、总结:

本题考察我们数学知识的,俗话说得好,学好数理化走遍天下都不怕,AC记录如下:

image.png

  • 时间复杂度O(1)
  • 空间复杂度O(1)

以上是本期内容,欢迎大佬们点赞评论,下期见~~