497题:非重叠矩形中的随机点

给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点。
https://leetcode-cn.com/problems/random-point-in-non-overlapping-rectangles/

import "math/rand"
import "time"

type Solution struct {
    P_map []int
    Elem [][]int
    Maxarea int
}


func Constructor(rects [][]int) Solution {
    var obj Solution
    area := 0
    obj.Elem = rects

    for i,_ := range rects{
        area += (rects[i][2] - rects[i][0] + 1) * (rects[i][3] - rects[i][1] + 1)
        obj.P_map = append(obj.P_map, area)
    }
    obj.Maxarea = area
    return obj
}


func (this *Solution) Pick() []int {
    rand.Seed(time.Now().UnixNano())
    n := rand.Intn(this.Maxarea)
    num := 0
    for i, v := range this.P_map {
        if n < v {
            num = i
            break
        }
    }
    x := rand.Intn(this.Elem[num][2]- this.Elem[num][0] + 1) + this.Elem[num][0]
    y := rand.Intn(this.Elem[num][3]- this.Elem[num][1] + 1) + this.Elem[num][1]
    return []int{x,y}
}

golang中使用随机种子获得随机数:

rand.Seed(time.Now().UnixNano())

将随机选取点的范围分散到所有矩形中。值得注意的是,因为点坐标是整数且可以落在边上,所以点的总数并不单纯等于面积。想象一个坐标网格,网格交叉的部分为一个点。因此实际点总数等于(长+1) *(宽+1)。
随机取一个点数量值,选定某个点数量范围内的矩形,再根据矩形长宽产生一个随机坐标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值