dengxinyi před 6 roky
rodič
revize
2bdf095fa6

+ 44 - 0
medium/497.random-point-in-non-overlapping-rectangles.go

@@ -0,0 +1,44 @@
+type Solution struct {
+	size  int
+	rects [][]int
+	areas []int
+}
+
+func Constructor(rects [][]int) (sol Solution) {
+	sol.size = len(rects)
+	sol.areas = make([]int, sol.size+1)
+	sol.rects = rects
+	for i := 0; i < sol.size; i++ {
+		r := rects[i]
+		w, h := r[2]-r[0]+1, r[3]-r[1]+1
+		sol.areas[i+1] = sol.areas[i] + w*h
+	}
+	return
+}
+
+func (this *Solution) Pick() []int {
+	idx := rand.Intn(this.areas[this.size])
+	beg, end := 1, this.size
+	for beg <= end {
+		mid := beg + (end-beg)/2
+		if this.areas[mid] < idx {
+			beg = mid + 1
+		} else {
+			end = mid - 1
+		}
+	}
+	if this.areas[beg] != idx {
+		beg--
+	}
+	pos := idx - this.areas[beg]
+	r := this.rects[beg]
+	w := r[2] - r[0] + 1
+	dx, dy := pos%w, pos/w
+	return []int{r[0] + dx, r[1] + dy}
+}
+
+/**
+ * Your Solution object will be instantiated and called as such:
+ * obj := Constructor(rects);
+ * param_1 := obj.Pick();
+ */

+ 25 - 0
medium/498.diagonal-traverse.go

@@ -0,0 +1,25 @@
+func findDiagonalOrder(matrix [][]int) (ans []int) {
+	m := len(matrix)
+	if m == 0 {
+		return
+	}
+	n := len(matrix[0])
+	if n == 0 {
+		return
+	}
+	x, y := 0, 0
+	dx, dy := 1, -1
+	for i := 0; i < m*n; i++ {
+		ans = append(ans, matrix[y][x])
+		if ny := y + dy; (ny == -1 || ny == m) && x != n-1 {
+			dx, dy = -dx, -dy
+			x++
+		} else if nx := x + dx; nx == -1 || nx == n {
+			dx, dy = -dx, -dy
+			y++
+		} else {
+			x, y = nx, ny
+		}
+	}
+	return
+}