Find Kth Number
题目描述
2个array,找第k大的元素
题目列表
- median of two sorted array
- find kth largest elemtn of array
Median of two sorted array
借用find kth的思想,偶数
个就要将中间两个平均,奇数
就返回中间那个
- 每次在nums1, nums2两个array中各取k/2位置a和b,因为index是0-based,所以index为k/2-1
- 如果有任意一个array的长度小于k/2,那么就可以省去另一个array的前k/2个
- 如果a < b, 那么可以丢掉nums1的前K/2, 反之也是
- 如果a == b,不可以直接返回a,因为也要确定k的奇偶,所以将它和a >= b一起处理
注意点
- 这里a == b的情况
- 如果k为偶数的话,这种情况下可以return
- 如果k为奇数的话,这里的a和b都不是第k的元素,而应该是下一个
- 这里为了code简单,直接传到下一个call中解决
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
n = len(nums1) + len(nums2)
if n % 2 == 1:
return self.findKth(nums1, nums2, n / 2 + 1)
else:
#偶数个,要取两个值的平均值
smaller = self.findKth(nums1, nums2, n / 2)
bigger = self.findKth(nums1, nums2, n / 2 + 1)
return (smaller + bigger) / 2.0
def findKth(self, nums1, nums2, k):
if len(nums1) == 0:
return nums2[k-1]
if len(nums2) == 0:
return nums1[k-1]
if k == 1:
return min(nums1[0], nums2[0])
if len(nums1) < k / 2:
a = None
else:
a = nums1[k/2 - 1]
if len(nums2) < k / 2:
b = None
else:
b = nums2[k/2 - 1]
if not a:
return self.findKth(nums1, nums2[k/2:], k - k/2)
if not b:
return self.findKth(nums1[k/2:], nums2, k - k/2)
if a < b:
return self.findKth(nums1[k/2:], nums2, k - k/2)
else:
return self.findKth(nums1, nums2[k/2:], k - k/2)