leetcode编程题(4)Median of Two Sorted Arrays

题目(英文版)

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

题目(中文翻译版)

这里有两个数组nums1 和 nums2 ,它们的长度分别是m和n。找到这两个排序数组的中值。要求运行的时间复杂度为O(log(m+n)).

解析

这里的要求的时间复杂度为m+n,则说明,需要用遍历的方式。

我们采用一个数组nums3,做nums1和nums2的合并,而且这个数组也是顺序存储的。然后找出其中的中间值就成。

主要是考虑合并后数组3的长度,如果是偶数的话,则有两个中值,这时候我们需要取两个中值相加除以2。如果长度是基数的话,则返回一个中值就成,这时候就通过num3中找到返回即可。

这里主要是合并算法可能大家有疑惑,这方面,就把数组考虑成一个链表就成,只不过这个链表是顺序存储的。

合并算法思路如下:
初始状态时,用p,q指向nums1和nums2的数组的第一个元素,然后进行比较。
这里写图片描述

算法

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int num1_length=nums1.length;
        int num2_length=nums2.length;
        int []nums3 = new int [num1_length+num2_length];
        int p=0,q=0,medu=0;
        while(p < num1_length && q < num2_length){
            if(nums1[p] <= nums2[q]){
                nums3[medu]=nums1[p];
                medu++;
                p++;
            }else{
                nums3[medu]=nums2[q];
                q++;
                medu++;
            }
        }

        //如果p遍历完毕
        while(q < num2_length){
            nums3[medu]=nums2[q];
            q++;medu++;

        }
        //如果q遍历完毕
        while(p < num1_length){
            nums3[medu]=nums1[p];
            p++;medu++;
        }
        if(nums3.length %2 == 0 && nums3.length !=0){
            int med1 = (nums3.length-1)/2;
            return (nums3[med1]+nums3[med1+1])/2.0;
        }else{
            return nums3[nums3.length/2];
        } 
    }
}

测试代码

package leetcode4;


public class Solution {

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {

        int num1_length=nums1.length;
        int num2_length=nums2.length;
        int []nums3 = new int [num1_length+num2_length];
        int p=0,q=0,medu=0;
        while(p < num1_length && q < num2_length){
            if(nums1[p] <= nums2[q]){
                nums3[medu]=nums1[p];
                medu++;
                p++;
            }else{
                nums3[medu]=nums2[q];
                q++;
                medu++;
            }
        }

        //如果p遍历完毕
        while(q < num2_length){
            nums3[medu]=nums2[q];
            q++;medu++;

        }
        //如果q遍历完毕
        while(p < num1_length){
            nums3[medu]=nums1[p];
            p++;medu++;
        }
        if(nums3.length %2 == 0 && nums3.length !=0){
            int med1 = (nums3.length-1)/2;
            return (nums3[med1]+nums3[med1+1])/2.0;
        }else{
            return nums3[nums3.length/2];
        }        
      }


    public static void main(String[] args) {
        Solution s = new Solution();
        int []nums1={};
        int []nums2 = {2,3};
        System.out.println(s.findMedianSortedArrays(nums1, nums2));
        int []nums3={1};
        int []nums4 = {2,3};
        System.out.println(s.findMedianSortedArrays(nums3, nums4));
    }
}

测试结果

这里写图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuYunTan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值