|
@@ -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
|
|
|
}
|