LeetCode题解(0004):寻找两个正序数组的中位数(Python)
发布日期:2021-06-29 19:51:35
浏览次数:3
分类:技术文章
本文共 3978 字,大约阅读时间需要 13 分钟。
LeetCode题解:0004
(困难)
解法 | 时间复杂度 | 空间复杂度 | 执行用时 | 内存消耗 |
---|---|---|---|---|
Ans 1 (Python) | O ( ( M + N ) l o g ( M + N ) ) O((M+N)log(M+N)) O((M+N)log(M+N)) | O ( M + N ) O(M+N) O(M+N) | 40ms (>98.73%) | 13.7MB (>6.15%) |
Ans 2 (Python) | O ( M + N ) O(M+N) O(M+N) | O ( 1 ) O(1) O(1) | 48ms (>89.95%) | 13.7MB (>6.15%) |
Ans 3 (Python) | O ( l o g ( M + N ) ) O(log(M+N)) O(log(M+N)) | O ( 1 ) O(1) O(1) | 80ms (>11.71%) | 13.8MB (>6.15%) |
解法一(直接合并数组排序求中位数):
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: nums = nums1 + nums2 nums.sort() count = len(nums) if count % 2 == 0: return (nums[int(count / 2 - 1)] + nums[int(count / 2)]) / 2 else: return nums[int(count / 2)]
解法二(直接寻找中位数的位置):
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: len_1 = len(nums1) len_2 = len(nums2) total = len_1 + len_2 left = -1 right = -1 index_1 = 0 index_2 = 0 for i in range(int(total / 2) + 1): left = right if index_1 < len_1 and (index_2 >= len_2 or nums1[index_1] < nums2[index_2]): right = nums1[index_1] index_1 += 1 else: right = nums2[index_2] index_2 += 1 if total % 2 == 0: return (left + right) / 2 else: return right
解法三(使用二分查找寻找中位数的位置):
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: len_1 = len(nums1) len_2 = len(nums2) total = len_1 + len_2 if len_1 == 0: if total % 2 == 0: return (nums2[int(total / 2 - 1)] + nums2[int(total / 2)]) / 2 else: return nums2[int(total / 2)] if len_2 == 0: if total % 2 == 0: return (nums1[int(total / 2 - 1)] + nums1[int(total / 2)]) / 2 else: return nums1[int(total / 2)] middle_num = (total + 1) // 2 index_1 = -1 index_2 = -1 already_num = 0 while True: surplus_num = middle_num - already_num # 剩余总量 if surplus_num == 1: find_number = 1 # 这一次二分的数量 else: find_number = surplus_num // 2 # 这一次二分的数量 binery_index_1 = index_1 + find_number binery_index_2 = index_2 + find_number # print(binery_index_1, binery_index_2) if binery_index_1 >= len_1: binery_index_1 = len_1 - 1 if binery_index_2 >= len_2: binery_index_2 = len_2 - 1 if index_1 == len_1 - 1: already_num += binery_index_2 - index_2 index_2 = binery_index_2 if index_2 == len_2 - 1: already_num += binery_index_1 - index_1 index_1 = binery_index_1 # print(binery_index_1, binery_index_2) if nums1[binery_index_1] < nums2[binery_index_2]: already_num += binery_index_1 - index_1 index_1 = binery_index_1 else: already_num += binery_index_2 - index_2 index_2 = binery_index_2 print("List1[" + str(binery_index_1) + "] =", nums1[binery_index_1], ",", "List2[" + str(binery_index_2) + "] =", nums2[binery_index_2], "→", min(nums1[binery_index_1], nums2[binery_index_2]), "(", already_num, ")", "-", index_1, index_2) if already_num >= middle_num: break print("index_1 =", index_1, "; index_2 =", index_2) if index_1 == -1: now_number = nums2[index_2] # print("Now:", index_2, nums2[index_2]) elif index_2 == -1: now_number = nums1[index_1] # print("Now:", index_1, nums1[index_1]) else: now_number = max(nums1[index_1], nums2[index_2]) # print("Now:", index_1, nums1[index_1], ",", index_2, nums2[index_2]) if index_1 + 1 >= len_1: next_number = nums2[index_2 + 1] elif index_2 + 1 >= len_2: next_number = nums1[index_1 + 1] else: next_number = min(nums1[index_1 + 1], nums2[index_2 + 1]) print("Now:", now_number, ";Next:", next_number) if total % 2 == 1: return now_number else: return (now_number + next_number) / 2
转载地址:https://dataartist.blog.csdn.net/article/details/106745229 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月29日 12时23分44秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux ALSA声卡驱动之四:Control设备的创建
2019-04-30
Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
2019-04-30
RT-thread相关
2019-04-30
Linux 2.6内核Makefile浅析
2019-04-30
编译和链接的过程
2019-04-30
Git学习(二):git-rev-parse命令初识
2019-04-30
vim字符串替换
2019-04-30
C语言:堆和栈的区别是什么?
2019-04-30
C语言:二级指针(指向指针的指针)详解
2019-04-30
C语言:断言assert函数完全攻略
2019-04-30
C语言:命令行选项解析函数---getopt()和getopt_long()
2019-04-30
C语言:inline,static inline
2019-04-30
Git学习(三):Git 撤销commit文件 和 回退push的文件
2019-04-30
WAV系列之一:G711编解码原理及代码实现
2019-04-30
WAV系列之二:ADPCM编解码原理及代码实现
2019-04-30
详解shell中source、sh、bash、./执行脚本的区别
2019-04-30
Git学习(四):git clean的用法
2019-04-30
Linux命令(一): ln - 创建和删除软、硬链接
2019-04-30
C语言:static关键字的作用
2019-04-30