week1

Median of Two Sorted Arrays (from leetCode)

A.题意

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,然后你找出这两个数组中所有数的中位数,要求的算法时间复杂度为O(log (m+n))。

B.思路

由两个数组已经排序好,并且对时间要求复杂度为O(log (m+n))我们很容易想到类比于归并排序的思路,我们只需要一个变量计数到中间位置,然后类似于归并排序思路把中位数找出来即可,每一次循环若数组nums1当前位置数字小于nums2当前位置数字则移动nums1当前位置,反之移动nums2.

C.代码实现

代码实现这里有一些临界的小细节一开始没考虑,所以这里写的有些小乱。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int all = nums1.size() + nums2.size();
        if(nums1.size() == 0) //处理nums1为空的情况
        {
            int size = nums2.size();
            if(size % 2 == 0)
                return (nums2[size / 2] + nums2[size / 2 - 1]) / 2.0;
            else
                return (double)nums2[size / 2];
        }
        if(nums2.size() == 0) //处理nums2为空的情况
        {
            int size = nums1.size();
            if(size % 2 == 0)
                return (nums1[size / 2] + nums1[size / 2 - 1]) / 2.0;
            else
                return (double)nums1[size / 2];
        }
        double ans;
        int num[2] = {0, 0}; //用来储存最近遍历的两个数字
        int j = 0, k = 0;
        for (int i = 0; i <= all / 2; i++)
        {
            if (nums1[j] <= nums2[k] && j < nums1.size())
            {
                num[0] = num[1];
                num[1] = nums1[j]; // 把大的数字放后面
                j++;
            }
            else if (nums1[j] > nums2[k] && k < nums2.size())
            {
                num[0] = num[1];
                num[1] = nums2[k]; // 把大的数字放后面
                k++;
            }
            else if (k >= nums2.size()) // 当nums2已经遍历完的情况
            {
                num[0] = num[1];
                num[1] = nums1[j];
                j++;
            }
            else if (j >= nums1.size()) // 当nums1已经遍历完的情况
            {
                num[0] = num[1];
                num[1] = nums2[k];
                k++;
            }
        }
        if (all % 2 == 0)
            ans = (num[0] + num[1]) / 2.0;
        else
            ans = (double)num[1];
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值