????????????游园路线图:
- ????乐园描述
- ????游园准备
- 暴力求解
- ????游玩总结
????????????????????????
????Hello,大家好我是Dream,欢迎大家来到刷题乐园????????????
????游园须知:这片乐园从不缺乏天才,努力才是你的最终入场券!????????????
????导游主要使用Python语言,同时欢迎其他语言的小伙伴进来玩耍
☀️☀️☀️
????游园过程中,如果发现有错误的话,欢迎大家评论区及时斧正❤️❤️❤️
????最后,祝大家游园愉快,一起加油进步????????????
????乐园描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
????游园准备
暴力求解
首先我们想到的便是暴力求解,将两个列表合并成一个列表,求其中位数!
合并列表,大家可能非常容易忘掉一个很好用的函数:sort 和 sorted 将两个列表按顺序合并排序
sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表,例如:
>>> print sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> L = [5, 2, 3, 1, 4]
>>> L.sort()
>>> print L
[1, 2, 3, 4, 5]
1、合并2个数组,排序
2、用len()求出列表的长度
3、按长度大小分奇偶给出答案即可
按照这个思路我们直接暴力求解:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
nums,m,n=sorted(nums1+nums2),len(nums1),len(nums2)
return (nums[(m+n-1)//2]+nums[(m+n)//2])/2
还算过得去,那如何正规解呢?
这里用到了二分查找早=,但我自己还弄不明白,这是参考的大佬的解法:
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
n1, n2 = len(nums1), len(nums2)
def get_kth_element(k: int) -> int:
i1, i2 = 0, 0
while k != 0:
if i1 == n1:
return nums2[i2 + k - 1]
if i2 == n2:
return nums1[i1 + k - 1]
if k == 1: #1//2 = 0 所有也要判断一下
return min(nums1[i1], nums2[i2])
new_i1 = min(i1 + k//2 - 1, n1 - 1) #每个数组贡献 k//2
new_i2 = min(i2 + k//2 - 1, n2 - 1)
pivot_1, pivot_2 = nums1[new_i1], nums2[new_i2]
if pivot_1 <= pivot_2: #把小的那段扔掉
k -= (new_i1 - i1 + 1) #做好index的更新
i1 = new_i1 + 1
else:
k -= (new_i2 - i2 + 1)
i2 = new_i2 + 1
n = n1 + n2
if n % 2 == 1:
return get_kth_element( (n+1) // 2 ) # 0 1 2 3 4 n=5 取第3个
else:
return ( get_kth_element( n//2 ) + get_kth_element( (n+2)//2 ) ) / 2.0 # 0 1 2 3 n=4 取第2个,第3个的aver
????游玩总结
The stage extends as far as the heart goes~加油!❤️❤️❤️
**????今天是我打卡的第六天,希望每天都能见到最棒的你????**
????????????最后一点小福利带给大家:如果想快速上手python的小伙伴们,这个详细整理PPT可以迅速帮助大家打牢python基础,需要的小伙伴们可以下载一下Python入门基础教程全套+小白速成+学不会来找我!
???????????? 好啦,这就是今天要给大家分享的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~