dengxinyi 6 年之前
父節點
當前提交
46b82394ae
共有 1 個文件被更改,包括 25 次插入20 次删除
  1. 25 20
      hard/668.kth-smallest-number-in-multiplication-table.go

+ 25 - 20
hard/668.kth-smallest-number-in-multiplication-table.go

@@ -1,26 +1,31 @@
-type minHeap [][2]int
-
-func (h minHeap) Len() int { return len(h) }
-func (h minHeap) Less(i, j int) bool {
-	if h[i][0] != h[j][0] {
-		return h[i][0] < h[j][0]
+func findKthNumber(m int, n int, k int) int {
+	beg, end := 1, m*n
+	for beg <= end {
+		mid := beg + (end-beg)/2
+		if rank(m, n, mid) < k {
+			beg = mid + 1
+		} else {
+			end = mid - 1
+		}
 	}
-	return h[i][1] < h[j][1]
-}
-func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
-
-func (h *minHeap) Push(x interface{}) {
-	*h = append(*h, x.([2]int))
+	return beg
 }
 
-func (h *minHeap) Pop() interface{} {
-	l := h.Len()
-	x := (*h)[l-1]
-	*h = (*h)[:l-1]
-	return x
+func rank(m, n, x int) (cnt int) {
+	// Find the rank row by row.
+	// Assume that x is in the ith row:
+	// 1*i 2*i 3*i ... n*i, then
+	// x/i is in row 1 2 3 ... n,
+	// so x is the (x/i)th num.
+	for i := 1; i <= m; i++ {
+		cnt += minInt(n, x/i)
+	}
+	return cnt
 }
 
-func findKthNumber(m int, n int, k int) int {
-	idx := make([]int, m)
-	return 0
+func minInt(x, y int) int {
+	if x < y {
+		return x
+	}
+	return y
 }