4. 寻找两个正序数组的中位数

时间:2022-4-13    作者:老大夫    分类: 力扣


题目地址: https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

题目要求:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。

代码

public class Solution {
    @Test
    public double findMedianSortedArrays(int[] nums1,int[] nums2 ) {
        int m=nums1.length;
        int n=nums2.length;
        int[] nums3=new int[m+n];//记录两个传入数组长度,并创建数组3大小为提供数组大小之和

        int i=0;                //将两个数组合并存放如数组3
        for(;i<m;i++){
            nums3[i]=nums1[i];
        }
        for(int j=0;j<n;j++){
             nums3[i+j]=nums2[j];
        }

        int mn=m+n;             //使用冒泡排序,给数组3从头到尾排序
        for(int x=0;x<mn;x++){
            for(int y=x+1;y<mn;y++){
                if(nums3[x]<nums3[y]){
                    int temp=nums3[y];
                    nums3[y]=nums3[x];
                    nums3[x]=temp;
                }
            }
        }

        int flag=-1;            //设置标识符
        int head=0,tail=m+n-1;      //设置首尾指针,分别从数组的 首和尾 向中间靠拢
        for(;  ;head++,tail-- ){
            if(head==tail){         //如果两个指针重合,标志符号设置为1,二者重合,首尾指针都可表示中位数
                flag=1;
                break;
            }
            if(head==tail-1){       //如果两个指针紧挨着,那么中位数为这两个数之和除以2
                flag=2;
                break;
            }
        }
        if(flag==1){
            System.out.println(nums3[head]);    //情况1,直接取出中位数
        }
        if (flag==2){                   //情况2,小数格式保存二者之和后除以2就是中位数
            double r1=nums3[head];
            double r2=nums3[tail];
            System.out.println((r1+r2)/2);
        }
        return 0;               //程序结束
    }
}

思路

统计给定两个数组的长度,并创建出第三个数组存放两个数组的内容
给数组3排序
创建首尾指针同时向数组中间靠拢
(1)情况1 中位数为首尾指针重叠处下标---直接取出中位数
(2)情况2 首尾指针在中间相邻处停止---中间两个数之和再除以2

难点

数组的合并
首尾指针向中间靠拢的停止条件

解决方法

  1. 首先用lenth方法直接求出两个数组的长度,创建数组3大小为数组1和数组2大小之和
    先将数组1添加入数组3,再将数组2添加入数组3
  2. 设置死循环,
    如果 首尾指针重合 ---- 那么break为情况1,
    如果首尾指针相邻,head等于tail-1 ---- 那么break为情况2

标签: 数组


扫描二维码,在手机上阅读

推荐阅读: