力扣题(3):寻找两个正序数组的中位数

官方的答案我勉强可以知道思路,但是让我敲代码我敲不出来,我只能做出来两个时间复杂度比较高的方法来完成这道题,具体的算法后续再看能不能更深层次的进行理解再更新吧:

package test004;

import java.util.Arrays;

public class findArraysMidNumber {
    public static void main(String[] args) {
        int[] nums1 = {1,3,3};
        int[] nums2 = {2,4,9};
        System.out.println(findMedianSortedArrays(nums1, nums2));
        System.out.println(findMedianSortedArrays2(nums1, nums2));
    }

    /**
     * 方法一:指针定位
     */
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n1 = nums1.length,n2 = nums2.length;
        //给两个数组定义指针
        int k1 = 0,k2 = 0;
        //中间数和中间数之前的数
        int pre = 0,current = 0;
        int totalLength = n1+n2;//总长度
        int middleIndex = totalLength/2;//因为索引是从0开始,所以不用考虑加一
        //遍历到中间数
        for (int i = 0; i <= middleIndex; i++) {
            //比较两个数组的相应位置的数字大小
            //那个数组的数字更小
            if (k1<n1 && (k2>=n2 || nums1[k1]<nums2[k2])){
                //就将那个数组指针当前指向的数字赋值给current
                current = nums1[k1];
                k1++;
            }else {
                current = nums2[k2];
                k2++;
            }
        }
        //判断奇偶数
        if (totalLength%2 == 0){//偶数
            return (pre+current)/2.0;
        }else {
            return current;
        }
    }

    /**
     * 方法二:合并数组
     */
    public static double findMedianSortedArrays2(int nums1[],int nums2[]){
        int ints[] = Arrays.copyOf(nums1,nums1.length+nums2.length);
        /**arraycopy()方法参数的概述
         * src:这是源数组,也就是要从哪个数组中复制元素。它是一个 Object 类型的参数,意味着可以传入任意类型的数组,如 int[]、char[]、String[] 等。
         * srcPos:表示源数组中开始复制元素的起始位置,索引从 0 开始计数。
         * dest:目标数组,即元素要复制到的数组。同样,它也是 Object 类型的参数,并且目标数组的类型要和源数组的类型兼容。
         * destPos:目标数组中开始粘贴元素的起始位置,索引同样从 0 开始。
         * length:要复制的元素个数。
         */
        System.arraycopy(nums2,0,ints,nums1.length,nums2.length);
        //通过Arrays.copyOf和System.arraycopy完成两个数组的合并
        //排序
        Arrays.sort(ints);
        //判断奇偶
        int middleIndex = ints.length/2;
        if (ints.length%2 == 0){//偶数
            return (ints[middleIndex]+ints[middleIndex-1])/2.0;
        }else {//奇数
            return ints[middleIndex]/2.0;
        }
    }
}

都写在注释里面了,二分法和二分边界分割法我后续再更新。

你可能感兴趣的:(算法题,leetcode,java,算法)