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

解法1:可以直接合并两个数组,然后对数组排序,再根据数组长度的奇偶性返回结果即可

package LeetCode;

import java.lang.reflect.Array;
import java.util.Arrays;

class  Solution{
    public static void main(String[] args) {
        int []num1={1,2};
        int []num2={3,4};
      double num= findMedianSortedArrays(num1,num2);
        System.out.println(num);
    }
    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        // 合成的数组
        int[] res = new int[len1+len2];
        int index = 0;
        int left = 0, right = 0;
        // 归并排序合成部分
        while(left<len1&&right<len2) {
            if(nums1[left]<nums2[right]) {
                res[index++] = nums1[left++];
            } else {
                res[index++] = nums2[right++];
            }
        }
        // 判断nums1剩余还是nums2剩余,并将剩余部分加入到合成的数组之后
        while(left<len1) {
            res[index++] = nums1[left++];
        }
        while(right<len2) {
            res[index++] = nums2[right++];
        }
        // 判断合成后的数组的长度,求出中位数。返回的是double类型
        if((len1+len2)%2==1) {     //数组长度为奇数
            return (double) res[(len1+len2)/2];
        } else {                                     //数组长度为偶数
            return (double) (res[(len1+len2)/2]+res[(len1+len2)/2-1])/2;
        }
    }

}

解法2:不需要将两个数组真的合并,我们只需要找到中位数在哪里就可以了

奇 数 \red {奇数} 中位数在(len+1)/2
偶 数 \red {偶数} 中位数为(len+1)/2 和len/2 两数除以2 所以不管是奇数还是偶数,都需要循环遍历(len+1)/2 次,才能找到中位数

①.left,right变量保存依次遍历的值,用aStart,bStart分别指向两个数组开始的位置,一次向后移动,每次移动的值的结果记录在right中,因为当长度为偶数是,需要两个数相除,得到其中位数,显然当只有一个变量只记录当前遍历的结果值是不够的,所以这是需要在定义一个变量,left记录上一次的值,也相当于两个中位数中(8,9)前后的关系,比如知道最后一的这个值为中位数9,因为长度为偶数,所以需要两个数,这时left保存的值,即为上一次right复制给left,这里就是一开始left=right 的作用
②.如果 B 数组此刻已经没有数字了,继续取数字 B[ bStart ],则会越界,则会越界,所以判断下 bStart 是否大于数组长度了,这样 || 后边的就不会执行了,也就不会导致错误了,所以增加为 aStart<m&&(bStart) >= n||A[aStart]<B[bStart]) 。
注意
|| 这个运算符 只要有就一个为假,结果就为假了

package LeetCode;

import java.lang.reflect.Array;
import java.util.Arrays;

class  Solution{
    public static void main(String[] args) {
        int []num1={1,2};
        int []num2={3,4};
      double num= findMedianSortedArrays(num1,num2);
        System.out.println(num);
    }

        public  static  double findMedianSortedArrays(int[] A, int[] B) {
            int m = A.length;
            int n = B.length;
            int len = m + n;
            int left = -1, right = -1;
            int aStart = 0, bStart = 0;
            for (int i = 0; i <= len / 2; i++) {
                left = right;
                if (aStart < m && (bStart >= n || A[aStart] < B[bStart])) {
                    right = A[aStart++];
                } else {
                    right = B[bStart++];
                }
            }
            if ((len & 1) == 0)   //len是一个变量让len和1按位做与运算,在这里实际上len&1的作用是:将len按二进制展开,看其最后一位是0还是1,亦即len是偶数还是奇数
                return (left + right) / 2.0;
            else
                return right;
        }


    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值