zoukankan      html  css  js  c++  java
  • 求两个排序数组中位数 C++

    题目描述:

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

    请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

    你可以假设 nums1 和 nums2 不同时为空。

    示例 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    中位数是 2.0
    

    示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    中位数是 (2 + 3)/2 = 2.5

    一个小技巧

    假设A、B数组分别有m,n个元素,我们找(m+n+1)/2和(m+n+2)/2这两个数,然后求其平均值,无论A、B两数组元素总数是奇数或者偶数,都能求得。

    思路:

    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    		int m = nums1.size();
    		int n = nums2.size();
    		int left = (m + n + 1) / 2;
    		int right = (m + n + 2) / 2;
    		return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;  //这一步可以省去奇偶分别讨论
    	}
    	int findKth(vector<int>& nums1, int i, vector<int>& nums2, int j, int k) {
    		if (i >= nums1.size()) return nums2[j + k - 1];
    		if (j >= nums2.size()) return nums1[i + k - 1];
    		if (k == 1) return min(nums1[i], nums2[j]);
    		int midVal1 = (i + k / 2 - 1 < nums1.size()) ? nums1[i + k / 2 - 1] : INT_MAX;   
    		int midVal2 = (j + k / 2 - 1 < nums2.size()) ? nums2[j + k / 2 - 1] : INT_MAX;
    		if (midVal1 < midVal2) {
    			return findKth(nums1, i + k / 2, nums2, j, k - k / 2);
    		}
    		else {
    			return findKth(nums1, i, nums2, j + k / 2, k - k / 2);
    		}
    	}
    };
  • 相关阅读:
    第11组(73) 需求分析报告
    第11组(73)团队展示
    结对编程作业
    第02组 Alpha冲刺 总结
    第02组 Alpha冲刺 (6/6)
    第02组 Alpha冲刺 (5/6)
    第02组 Alpha冲刺 (4/6)
    第02组 Alpha冲刺 (3/6)
    第02组 Alpha冲刺 (2/6)
    第02组 Alpha冲刺 (1/6)
  • 原文地址:https://www.cnblogs.com/zhousong918/p/9887866.html
Copyright © 2011-2022 走看看