leetcode median Of Two Sorted Arrays 求两个有序数组的中位数 第四题

public class medianOfTwoSortedArrays_4 {
    /**
     * 
     * 因为两个数组是有序的,分别为每个数组设定一个指针,按照数的大小,交替向前走,思路同将两个有序数组合并为一个有序数组
     * 记录两个指针的总步数和,不能超过两数组长度和的一半
     * 循环终止时,若为奇数,则最新的数的指针指在中位数的前一位上;若为偶数,则最新的数的指针指在两位中位数的第一位上;二者均需找到下一个位置的数。具体代码见60-80行
     * 15-26行对特殊情况进行处理
     * 时间复杂度O(*)空间复杂度O(1)
     * 
     * @param nums1
     * @param nums2
     * @return
     */
    public  static double  findMedianSortedArrays(int[] nums1, int[] nums2) {

        int length1 = nums1.length;
        int length2 = nums2.length;
        int lengthSum = length1 + length2;
        boolean flag = false;

        if(lengthSum % 2 == 0){
            flag = true;
        }
        if(lengthSum == 0){
            return  0;
        }
        if(length1 == 0 && length2 < 2){
                return nums2[0];
        }
        if(length2 == 0 && length1 < 2){
            return nums1[0];
        }
        int nums1Index = 0;
        int nums2Index = 0;
        int indexMid = lengthSum / 2;
        double result = 0;
        boolean whileNums1 = false;
        boolean whileNums2 = false;
        while(nums1Index < length1 && nums2Index < length2 && nums1Index + nums2Index < indexMid){
            if(nums1[nums1Index] <= nums2[nums2Index]){
                ++nums1Index;
                whileNums1 = true;
                whileNums2 = false;
            }else{
                ++nums2Index;
                whileNums1 = false;
                whileNums2 = true;

            }
        }
        while (nums1Index < length1 && nums1Index + nums2Index < indexMid){
            ++nums1Index;
            whileNums1 = true;
            whileNums2 = false;
        }
        while (nums2Index < length2 && nums1Index + nums2Index < indexMid){
            ++nums2Index;
            whileNums1 = false;
            whileNums2 = true;
        }
            int indexMidValue = 0;
            if( whileNums1 == true && whileNums2 == false){
                indexMidValue = nums1[--nums1Index];
            }else{
                indexMidValue = nums2[--nums2Index];
            }
            int indexMidValue2 = 0;
            if( whileNums1 == true && whileNums2 == false){
                nums1Index++;
            }else{
                nums2Index++;
            }
            if(nums1Index < length1){
                if(nums2Index < length2){
                    indexMidValue2 = nums1[nums1Index]<nums2[nums2Index]?nums1[nums1Index]:nums2[nums2Index];
                }else {
                    indexMidValue2 = nums1[nums1Index];
                }
            }else {
                indexMidValue2 = nums2[nums2Index];
            }
        if (flag){
            // 偶数
            result = (double)(indexMidValue + indexMidValue2) / 2;
        }else {
            // 奇数
            result = (double)indexMidValue2;
        }
        return result;
    }
    public  static  void  main(String[] args){
        int[] nums1 ={};
        int[] nums2 ={1};
        System.out.println(findMedianSortedArrays(nums1,nums2));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值