算法探索_寻找两个正序数组的中位数

这是一道在力扣中难度标为困难的题,

我其实薛微的有点怀疑,这个题的难度是不是顶多算中等

问题描述:

给定两个大小为 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提交过,但我是真没想到内存节省上面超越了所有人!

猜你喜欢

转载自blog.csdn.net/qq_39731011/article/details/107575789