[Leetcode4]两个排序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1nums2 不同时为空。

解法粗暴丑陋,等写完论文有时间再思考优化方法改进一下。

python:

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        l1 = len(nums1)
        l2 = len(nums2)
        if l1 == 0:
            if l2%2 == 1:
                midIndex = ((l2-1)/2)
                midNum = nums2[midIndex]
            else:
                left = (l2 / 2)
                right = left - 1
                midNum = (float(nums2[left]+nums2[right])/2)
        elif l2 == 0:
            if l1%2 == 1:
                midIndex = ((l1-1)/2)
                midNum = nums1[midIndex]
            else:
                right = (l1 / 2)
                left = right - 1
                midNum = (float(nums1[left]+nums1[right])/2)
        elif l1 == 1 and l2 == 1:
            midNum = (float(nums1[0]+nums2[0])/2)
        else:
            nums = nums1 + nums2
            nums = sorted(nums)
            l = l1 + l2
            if l%2 == 1:
                midIndex = ((l-1)/2)
                midNum = nums[midIndex]
            else:
                right = (l / 2)
                left = right - 1
                midNum = (float(nums[left]+nums[right])/2)
        return midNum

C++(效率比较低): 

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int l1 = nums1.size();
        int l2 = nums2.size();
        double midNum = 0.0;
        if(l1 == 0 || l2 == 0){
            if(l1 == 0){
                vector<int> nums(nums2);
                int l = l2;
                if(l % 2 != 0){
                    int midIndex = ((l-1)/2);
                    midNum = static_cast<double>(nums[midIndex]);
                }
                else{
                    int right = (l/2);
                    int left = right - 1;
                    midNum = static_cast<double>(nums[left] + nums[right]);
                    midNum /= 2;
                }
            }
            else{
                vector<int> nums(nums1);
                int l = l1;
                if(l % 2 != 0){
                    int midIndex = ((l-1)/2);
                    midNum = static_cast<double>(nums[midIndex]);
                }
                else{
                    int right = (l/2);
                    int left = right - 1;
                    midNum = static_cast<double>(nums[left] + nums[right]);
                    midNum /= 2;
                }
            }
        }
        else{
            for(int i = 0;i<l2;i++){
                nums1.push_back(nums2[i]);
            }
            sort(nums1.begin(),nums1.end());
            vector<int> nums(nums1);
            int l = l1 + l2;
            if(l % 2 != 0){
                int midIndex = ((l-1)/2);
                midNum = static_cast<double>(nums[midIndex]);
            }
            else{
                int right = (l/2);
                int left = right - 1;
                midNum = static_cast<double>(nums[left] + nums[right]);
                midNum /= 2;
            }
        }
        return midNum;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_40501689/article/details/82756744
今日推荐