题解 | #三个牛群中位数#
三个牛群中位数
https://www.nowcoder.com/practice/8bc0369faf7c4ac5ab336f38e859db05
- 题目考察的知识点 : 二分,分而治之
- 题目解答方法的文字分析:
- 比较三个数组的长度,将长度最小的数组作为第二个数组参与比较,将长度最大的数组作为第三个数组参与比较。
- 如果第一个数组为空,直接在第二个、第三个数组中查找第 k 小的元素。
- 如果 k=1,直接返回三个数组中最小的元素。
- 确定比较点 i、j、q,比较三个数组对应位置上的元素大小。
- 如果 herd1[i] 最小,说明中位数在 herd1[i+1:]、herd2[l2:]、herd3[l3:] 这三个数组中,此时递归调用 find_k_minest_3 方法,在新的三个数组中查找第 k-(i+1-l1) 小的元素。
- 如果 herd2[j] 最小,说明中位数在 herd1[l1:]、herd2[j+1:]、herd3[l3:] 这三个数组中,此时递归调用 find_k_minest_3 方法,在新的三个数组中查找第 k-(j+1-l2) 小的元素。
- 如果 herd3[q] 最小,说明中位数在 herd1[l1:]、herd2[l2:]、herd3[q+1:] 这三个数组中,此时递归调用 find_k_minest_3 方法,在新的三个数组中查找第 k-(q+1-l3) 小的元素。
- 本题解析所用的编程语言:Python
- 完整且正确的编程代码
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param herd1 int整型一维数组
# @param herd2 int整型一维数组
# @param herd3 int整型一维数组
# @return double浮点型
#
class Solution:
def findMedianSortedArray(
self, herd1: List[int], herd2: List[int], herd3: List[int]
) -> float:
n1, n2, n3 = len(herd1), len(herd2), len(herd3)
left = (n1 + n2 + n3 - 1) // 2 + 1
right = (n1 + n2 + n3) // 2 + 1
return (
self.find_k_minest_3(herd1, 0, n1, herd2, 0, n2, herd3, 0, n3, left)
+ self.find_k_minest_3(herd1, 0, n1, herd2, 0, n2, herd3, 0, n3, right)
) / 2.0
def find_k_minest_3(self, herd1, l1, r1, herd2, l2, r2, herd3, l3, r3, k):
len1, len2, len3 = r1 - l1, r2 - l2, r3 - l3
if len2 < len1 and len2 <= len3:
return self.find_k_minest_3(herd2, l2, r2, herd1, l1, r1, herd3, l3, r3, k)
if len3 < len1:
return self.find_k_minest_3(herd3, l3, r3, herd2, l2, r2, herd1, l1, r1, k)
if l1 == r1:
return self.find_k_minest(herd2, l2, r2, herd3, l3, r3, k)
if k == 1:
return min(herd1[l1], min(herd2[l2], herd3[l3]))
i = l1 + min(len1, k // 2) - 1
j = l2 + k // 2 - 1
q = l3 + k // 2 - 1
min_val = min(herd1[i], min(herd2[j], herd3[q]))
if min_val == herd1[i]:
return self.find_k_minest_3(
herd1, i + 1, r1, herd2, l2, r2, herd3, l3, r3, k - (i + 1 - l1)
)
elif min_val == herd2[j]:
return self.find_k_minest_3(
herd1, l1, r1, herd2, j + 1, r2, herd3, l3, r3, k - (j + 1 - l2)
)
else:
return self.find_k_minest_3(
herd1, l1, r1, herd2, l2, r2, herd3, q + 1, r3, k - (q + 1 - l3)
)
def find_k_minest(self, nums1, l1, r1, nums2, l2, r2, k):
len1, len2 = r1 - l1, r2 - l2
if len1 > len2:
return self.find_k_minest(nums2, l2, r2, nums1, l1, r1, k)
if l1 == r1:
return nums2[l2 + k - 1]
if k == 1:
return min(nums1[l1], nums2[l2])
i = l1 + min(k // 2, len1) - 1
j = l2 + k // 2 - 1
if nums1[i] > nums2[j]:
return self.find_k_minest(nums1, l1, r1, nums2, j + 1, r2, k - (j - l2 + 1))
else:
return self.find_k_minest(nums1, i + 1, r1, nums2, l2, r2, k - (i - l1 + 1))
牛客高频top202题解系列 文章被收录于专栏
记录刷牛客高频202题的解法思路
查看7道真题和解析