leetcode4.寻找两个正序数组的中位数——学习笔记

题目:力扣icon-default.png?t=L9C2https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        double median;
        int[] nums3 = combine(nums1,nums2);
        nums3 = sort(nums3);
        double[] nums4 = new double[nums3.length];
        for(int i=0;i<nums3.length;i++){
            nums4[i] = (double)nums3[i];
        }
        median = mid(nums4);
        return median;
    }

    public int[] combine(int[] nums1,int[] nums2){
        int[] temp = new int[nums1.length+nums2.length];
        for(int i=0;i<nums1.length;i++){
            temp[i] = nums1[i];
        }
        for(int j=0;j<nums2.length;j++){
            temp[nums1.length+j] = nums2[j];
        }
        return temp;
    }

    public int[] sort(int[] temp){
        int p;
        for(int i=0;i<temp.length;i++){
            for(int j=i+1;j<temp.length;j++){
                if(temp[i]>temp[j]){
                    p = temp[i];
                    temp[i] = temp[j];
                    temp[j] = p;
                }
            }
        }
        return temp;
    }

    public double mid(double[] temp){
        double t;
        int s;
        if(temp.length%2==1){
            s = (temp.length-1)/2;
            t = temp[s];
        }else{
            double sum;
            s = temp.length/2;
            sum = temp[s]+temp[s-1];
            t = sum/2;
        }
        return t;
    }
}

(这题leetcode定义的难度为“困难”,但是若按照我这种常规思路去做其实是非常简单的,当然,面试官肯定也不会满意这种答案的。奈何暂时水平有限,先凑合着吧。)

思路:非常非常常规(low)的思路,合并,排序,折中。

1.合并两个数组,用新的数组储存。

public int[] combine(int[] nums1,int[] nums2){
    int[] temp = new int[nums1.length+nums2.length];
    for(int i=0;i<nums1.length;i++){
        temp[i] = nums1[i];
    }
    for(int j=0;j<nums2.length;j++){
        temp[nums1.length+j] = nums2[j];
    }
    return temp;
}

2.对已经完成合并的新数组进行排序,从大到小或者从小到大都无所谓,我这里是从小到大排序的。

public int[] sort(int[] temp){
    int p;
    for(int i=0;i<temp.length;i++){
        for(int j=i+1;j<temp.length;j++){
            if(temp[i]>temp[j]){
                p = temp[i];
                temp[i] = temp[j];
                temp[j] = p;
            }
        }
    }
    return temp;
}

3.对排序成功的数组进行折中寻找中位数,这里需要分类讨论。若数组长度为奇数,则中位数为最中间的那个数;若数组长度为偶数,则需要将最中间的两个数求和取平均作为中位数。值得注意的是,最后中位数可能出现小数的情况,则需要用double数据类型去表示,所以此时折中找中位数的方法也是double类型的。

public double mid(double[] temp){
    double t;
    int s;
    if(temp.length%2==1){
        s = (temp.length-1)/2;
        t = temp[s];
    }else{
        double sum;
        s = temp.length/2;
        sum = temp[s]+temp[s-1];
        t = sum/2;
    }
    return t;
}

4.上面写的是三个单独的方法,按照逻辑调用即可。for循环是将int类型的数组,强制转换成double类型的数组,以便于调用这种找中位数(mid)方法。

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    double median;
    int[] nums3 = combine(nums1,nums2);
    nums3 = sort(nums3);
    double[] nums4 = new double[nums3.length];
    for(int i=0;i<nums3.length;i++){
        nums4[i] = (double)nums3[i];
    }
    median = mid(nums4);
    return median;
}

5.返回中位数。

return median;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hokachi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值