给定一个非重叠轴对齐矩形的列表 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)。
随机取一个点数量值,选定某个点数量范围内的矩形,再根据矩形长宽产生一个随机坐标。