#include <climits> #include <random> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weightsA int整型vector * @param weightsB int整型vector * @return double浮点型 */ double findMedianSortedArrays(vector<int>& weightsA, vector<int>& weightsB) { // write code here if (weightsA.size() == 0) { if (weightsB.size() % 2 == 0) { return (double)(weightsB[weightsB.size()/2-1] + weightsB[weightsB.size()/2])/2; } return (double)weightsB[weightsB.size()/2]; } if (weightsB.size() == 0) { if (weightsA.size() % 2 == 0) { return (double)(weightsA[weightsA.size()/2-1] + weightsA[weightsA.size()/2])/2; } return (double)weightsA[weightsA.size()/2]; } int len = weightsA.size() + weightsB.size(); if (len %2 == 0) { return (getKth(weightsA, 0, weightsB, 0, len/2) + getKth(weightsA, 0, weightsB, 0, len/2+1))/2.0; } return getKth(weightsA, 0, weightsB, 0, len/2+1); } // 找第k个元素,如果不够比较的,后面补整形最大值 double getKth(vector<int>& weightsA, int beginA, vector<int>& weightsB, int beginB, int k) { // 直接从B中找到第k个 if (beginA >= weightsA.size()) { return weightsB[beginB+k-1]; } // 直接从A中找第k个 if (beginB >= weightsB.size()) { return weightsA[beginA+k-1]; } if (k==1) { return min(weightsA[beginA], weightsB[beginB]); } // 如果k/2超过了数组长度,就假定后面所有的数字都是INT_MAX,不影响最终结果 int k_2_num_a = INT_MAX; int k_2_num_b = INT_MAX; if (beginA + k/2-1 < weightsA.size()) k_2_num_a = weightsA[beginA+k/2-1]; if (beginB + k/2-1 < weightsB.size()) k_2_num_b = weightsB[beginB+k/2-1]; if (k_2_num_a < k_2_num_b) { return getKth(weightsA, beginA+k/2, weightsB, beginB, k - k/2); } return getKth(weightsA, beginA, weightsB, beginB+k/2, k-k/2); } };