题解 | #寻找第K大#
寻找第K大
http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf
package main import ( "math/rand" "time" ) //基于快排的选择算法:时空On,logn func findKth( a []int , n int , K int ) int { rand.Seed(time.Now().UnixNano()) return quickSelect(a, 0, len(a)-1, len(a)-K) } func quickSelect(a []int, l, r, index int) int { q := randomPartition(a, l, r) if q == index { return a[q] } else if q < index { return quickSelect(a, q + 1, r, index) } return quickSelect(a, l, q - 1, index) } func randomPartition(a []int, l, r int) int { i := rand.Int() % (r - l + 1) + l a[i], a[r] = a[r], a[i] return partition(a, l, r) } func partition(a []int, l, r int) int { x := a[r] i := l - 1 for j := l; j < r; j++ { if a[j] <= x { i++ a[i], a[j] = a[j], a[i] } } a[i+1], a[r] = a[r], a[i+1] return i + 1 }