WC130 寻找第K大
思路:快速排序后
# -*- coding:utf-8 -*- class Solution: def findKth(self, a, n, K): # write code here a_sort = self.quick_sort(a, 0, n-1) return a_sort[n-K] def quick_sort(self,l,left,right): if left >= right: return low = left high = right point = l[low] while low < high: while low < high and point<= l[high]: high -= 1 while low <high and point >=l[low]: low += 1 self.swap(l, low, high) self.swap(l, left, low) self.quick_sort(l,left,low-1) self.quick_sort(l,low+1,right) return l def swap(self,l,i,j): tem = l[i] l[i] = l[j] l[j] = tem
偷懒解法
class Solution: def findKth(self, a, n, K): # write code here a.sort() return a[n-K]
二分+快排:当右边有k-1个值大于p,左边n-k个值小于p,返回P即可
# -*- coding:utf-8 -*- class Solution: def partsort(self, l, left, right): point = l[left] low = left high = right point = l[low] while low < high: while low < high and point<= l[high]: high -= 1 while low <high and point >=l[low]: low += 1 self.swap(l, low, high) self.swap(l, left, low) return low def swap(self,l,i,j): tem = l[i] l[i] = l[j] l[j] = tem def findKth(self, a, n, K): # write code here l = 0 r = n - 1 div = self.partsort(a, l, r) while(div != n-K): #只有当刚好右边有k-1个大于div处的值时,返回此时的值,否则只需对一边排序 if div < n-K: div = self.partsort(a, div + 1, r) else: div = self.partsort(a, l, div - 1) return a[div]