js解leetcode(37)-中等

1.在圆内生成随机点

题目:

给定圆的半径和圆心的 x、y 坐标,写一个在圆中产生均匀随机点的函数 randPoint 。

说明:

输入值和输出值都将是浮点数。
圆的半径和圆心的 x、y 坐标将作为参数传递给类的构造函数。
圆周上的点也认为是在圆中。
randPoint 返回一个包含随机点的x坐标和y坐标的大小为2的数组。

思路:简单直接的思路,就是拒绝采样。我们不能直接获取圆内的随机数,但是可以获取正方形区域的随机数。因此可以随机在对应的正方形内取点,然后判断是否在圆内,如果在圆内就返回,不在圆内就继续取

时间复杂度:正常O(1),极端情况正无穷。空间复杂度O(1)

/**
 * @param {number} radius
 * @param {number} x_center
 * @param {number} y_center
 */
var Solution = function (radius, x_center, y_center) {
  this.center = [x_center, y_center];
  this.radius = radius;
};

/**
 * @return {number[]}
 */
Solution.prototype.randPoint = function () {
  const xLeft = this.center[0] - this.radius;
  const yBottom = this.center[1] - this.radius;
  let x = xLeft + Math.random() * 2 * this.radius;
  let y = yBottom + Math.random() * 2 * this.radius;
  while (
    (x - this.center[0]) * (x - this.center[0]) +
      (y - this.center[1]) * (y - this.center[1]) >
    this.radius * this.radius
  ) {
    x = xLeft + Math.random() * 2 * this.radius;
    y = yBottom + Math.random() * 2 * this.radius;
  }
  return [x, y];
};

/**
 * Your Solution object will be instantiated and called as such:
 * var obj = new Solution(radius, x_center, y_center)
 * var param_1 = obj.randPoint()
 */

也可以用分布函数的 方式。可以在360°内随机取一个角度,然后计算正弦和余弦,在随机取一个半径。因为涉及到扇形,所以要在0-r2内随机取然后开方

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


/**
 * @param {number} radius
 * @param {number} x_center
 * &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值