leetcode 4 --- 寻找两个有序数组的中位数

1 题目

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

进阶:设计一个时间复杂度为 O(log (m+n)) 的算法.

2 解法

这个题如果m+n是偶数, 就是找到第(m+n)/2以及第(m+n)/2 + 1个数, 如果是奇数, 那么就是第(m+n +1)/2个数.

2.1 普通解法

2.1.1 思路

因为两个序列都是排好序的, 那就按照双指针法找当前两个序列中更小的数

2.1.2 代码

太笨了...毕竟这不是时间复杂度为log(m+n)的方法, 也就不优化了:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        double result = 0.0;
        int nums1_size = nums1.size();
        int nums2_size = nums2.size();
        int nums1_offset = 0;
        int nums2_offset = 0;
        bool total_num_odd = ((nums1_size + nums2_size) % 2 == 0 ? false : true);
        int target_index = (nums1_size + nums2_size - 1) / 2;
        while (nums1_offset < nums1_size && nums2_offset < nums2_size && target_index) {
            if (nums1[nums1_offset] <= nums2[nums2_offset]) {
                nums1_offset ++;
            } else {
                nums2_offset ++;
            }
            target_index --;
        }
        if (nums1_offset == nums1_size) {
            if (total_num_odd) {
                result = (double)nums2[target_index + nums2_offset];
            } else {
                result = (double)((nums2[target_index + nums2_offset] + nums2[target_index + nums2_offset + 1]) / 2.0);
            }
        } else if (nums2_offset == nums2_size) {
            if (total_num_odd) {
                result = (double)nums1[target_index + nums1_offset];
            } else {
                result = (double)((nums1[target_index + nums1_offset] + nums1[target_index + nums1_offset + 1]) / 2.0);
            }
        } else {
            if (total_num_odd) {
                result = (double)(nums1[nums1_offset] < nums2[nums2_offset] ? nums1[nums1_offset] : nums2[nums2_offset]);
            } else {
                if (nums1[nums1_offset] < nums2[nums2_offset]) {
                    if (nums1_offset + 1 < nums1_size && nums1[nums1_offset + 1] < nums2[nums2_offset]) {
                        result = (double)((nums1[nums1_offset] + nums1[nums1_offset + 1]) / 2.0);
                    } else {
                        result = (double)((nums1[nums1_offset] + nums2[nums2_offset]) / 2.0);
                    }
                } else {
                    if (nums2_offset + 1 < nums2_size && nums2[nums2_offset + 1] < nums1[nums1_offset]) {
                        result = (double)((nums2[nums2_offset] + nums2[nums2_offset + 1]) / 2.0);
                    } else {
                        result = (double)((nums1[nums1_offset] + nums2[nums2_offset]) / 2.0);
                    }
                }
            }
        }
        
        return result;
    }
};

这种解法的时间复杂度是o(m + n). 

2.2 时间复杂度o(log(m+n))解法

2.2.1 思路

既然涉及到时间复杂度是o(log(m+n)), 就要用到二分法了. 感觉这样做坑挺多. 后来看了标准答案, 跳出对比两个序列中位数的固有思维, 转而寻找整个序列的第K的数, 如果m + n是奇数, 那么就是要寻找 (m + n) / 2, 如果m + n是偶数, 那么就要找(m + n) / 2  - 1和(m + n) / 2.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值