这是一道在力扣中难度标为困难的题,
我其实薛微的有点怀疑,这个题的难度是不是顶多算中等
问题描述:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
解决思路:
1.数据合并,这个我就不多说了 就是俩数组装一个集合
2.数据排序,我这边使用了插入排序,
如果要了解排序过程的话:客官里边请!https://blog.csdn.net/qq_39731011/article/details/95342246
3.数据返回,首先要读懂题意,
假如合并后的数据总长度为奇数,那么返回中间的数
假如为偶数,那么返回中间两个数的合除以2
/*
*作者:赵星海
*时间:2020/7/25 9:15
*用途:寻找两个正序数组的中位数
*/
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if (nums1.length==0&&nums2.length==0)return 0.0;
//1.数据合并
ArrayList<Integer> list = new ArrayList<>();
if(nums1.length!=0)
for (int ele : nums1) {
list.add(ele);
}
if(nums2.length!=0)
for (int ele : nums2) {
list.add(ele);
}
//2.数据排序 (插入排序)详情:https://blog.csdn.net/qq_39731011/article/details/95342246
int i,j,temp; //temp 正在执行插入的数
for(i=1;i<list.size();i++) {
temp=list.get(i);
for(j=i-1;j>=0;j--) {
if (temp > list.get(j)) { //顺序正确,停止探索
break;
}else{ //元素后移
list.set(j+1, list.get(j));
}
}
list.set(j+1,temp);
}
//3.数据返回
if (list.size()%2==0){
//偶数
int x = list.size()/2;
return (double) ((float)(list.get(x-1)+list.get(x))/2);
}else {
//奇数
return (double) ((list.get((list.size()-1)/2)));
}
}
1.深海一开始想不合并直接将小集合有序并入大集合,那样效率更高,但是写来写去发现实在是麻烦。
2.最粗暴最简单的方式不一定就不好,你看下我这次的提交记录,绝对让你大跌眼镜
我不知道这道被标为困难的简单算法有多少java提交过,但我是真没想到内存节省上面超越了所有人!