leetcode第四题(寻找两个正序数组的中位数)

这篇博客详细介绍了如何解决LeetCode第四题——寻找两个正序数组的中位数。作者提供了两种不同的解题方法,第一种通过合并两个数组后再找中位数,第二种则是不合并数组,直接找到中位数所在位置。博客内容涉及到数组操作、条件判断以及遍历技巧,适合于学习算法和数据结构的读者。
摘要由CSDN通过智能技术生成

leetcode第四题(寻找两个正序数组的中位数)

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int nums[] ;
        int m = nums1.length;
        int n = nums2.length;
        nums = new int[m + n];
        //这里数组nums1进行判定
        if(m == 0){
            if(n % 2 == 0){
                return ((nums2[n / 2 - 1]) + nums2[n /2]) / 2;
            }else{
                return nums2[n /2];
            }
        }

        //这里对nums2进行判定
        if(n == 0){
            if(m % 2 == 0){
                return (nums1[m / 2 - 1] + nums1[m /2]) /2.0;
            }else{
                return nums1[m /2];
            }
        }

        //实现两个数组的合并
        int count = 0;
        int i = 0,j = 0;
        while(count != (m + n)){
            //这里其实就是两个简单的保护机制  对两个数组为空的情况进行解决罢了 很显然m就不可能为0啊
            if(i == m){
                while(j != n){
                    //这里虽然都是 count和j均为0  但是一定要分开查询的
                    nums[count++] = nums2[j++];
                }
                break;
            }

            if(j == n){
                while(i != m){
                    nums[count++] = nums1[i++];
                }
                break;
            }

            //将两个数组里面的大小的数 进行比较 然后一个个的添加到数组nums去
            if(nums1[i] < nums2[j]){
                //注意:这里的count和i会自己进行循环的自增
                nums[count++] = nums1[i++];
            }else{
                nums[count++] = nums2[j++];
            }
        }

        //最后一步 从有序数组里面去取出最后的答案
        if(count % 2 == 0){
            return (nums[count / 2 - 1] + nums[count  /2]) / 2.0;

        }else{
            return nums[count / 2];
        }
    }
}

第二种解题思路:

  1. 我们并不需要将两个数组进行真的合并,我们只需要找到中位数在哪里就好了
  2. 怎么样将奇数和偶数的情况进行合并一下
    1. 用len表示合并数组后的长度
      1. 如果是奇数,我们我们只需要知道第(len + 1) /2 个数就可以了.如果遍历的话需要遍历 int (len / 2) + 1次.如果是偶数,我们需要知道第 len /2 个和 len /2 + 1个数
      2. 返回中位数的话,奇数需要最后的一次遍历就可以了,偶数需要在最后一次和上一次遍历的结果,所以我们用两个 left和 right 保存当前循环变量的结果,接下来为right的最后一次更新结果
      3. 循环中该怎么写,什么时候num1数组进行后移,什么时候nums2数组进行后移,用astart和bstart分别表示当前指向两个数组的位置,如果astart还没有到最后,并且此时a位置的数字小于b位置的次数,那么就可以后移了,.也就是astart < m && num1[astart] < num2[bstart[
      4. 但是如果b数组此时已经没有数字了,继续取数字B[bstart],则会越界,所以判断bstart是否大于数组长度了,这样
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        //我们并不需要直接吧两个数组进行合并
        int m = nums1.length;
        int n = nums2.length;
        int len = m + n;
        int left = -1;
        int right = -1;
        int aStart = 0;
        int bStart = 0;
        for(int i = 0;i <= len / 2;i++){
            left = right;
            if(aStart < m &&(bStart >= n || nums1[aStart] < nums2[bStart])){
                right = nums1[aStart++];
            }else{
                right = nums2[bStart++];
            }
        }


    if((len & 1) == 0){
        return (double)(left + right)/2;
    }else{
        return right;
    }
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值