1. 程式人生 > >#leetcode刷題之路4-尋找兩個有序數組的中位數

#leetcode刷題之路4-尋找兩個有序數組的中位數

大小 let pre 個數 clu emp 。。 tco net

給定兩個大小為 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

思路:計算兩個數組的長度,按照依次對比大小的方式把兩個數組合並成一個,按照長度求出計算中位數的是哪兩個(長度和為偶數)或一個(長度和為奇數)。然後普通思路進行。。。

#include <iostream>
#include 
<vector> double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) { int len1 = nums1.size(); int len2 = nums2.size(); int a = 0, b = 0; int count = 0; if (((len1 + len2) % 2) == 0) { int num1 = (len1 + len2) / 2;
int num2 = (len1 + len2) / 2 + 1; double *s = new double[num2]; while (count<num2) { if ((a<len1&&b<len2&&nums1[a]<=nums2[b]) || (a<len1&&b == len2)) { s[count] = nums1[a]; a
++; } else if ((a<len1&&b<len2&&nums1[a]>nums2[b]) || (b < len2&&a == len1)) { s[count] = nums2[b]; b++; } else break; count++; } double temp1 = s[num2 - 1]; double temp2 = s[num1 - 1]; delete[] s; return (temp1+temp2) / 2; } else { int num1 = (len1 + len2) / 2 + 1; double *s = new double[num1 + 1]; while (count<num1+1) { if ((a<len1&&b<len2&&nums1[a]<=nums2[b]) || (a<len1&&b == len2)) { s[count] = nums1[a]; a++; } else if ((a<len1&&b<len2&&nums1[a]>nums2[b]) || (b < len2&&a == len1)) { s[count] = nums2[b]; b++; } else break; count++; } double temp = s[num1 - 1]; delete[] s; return temp; } } int main() { std::vector<int> a = { 0 }; std::vector<int> b = { 0 }; double aa = findMedianSortedArrays(a, b); std::cout << aa << std::endl; system("pause"); return 0; }

執行用時: 72 ms, 在Median of Two Sorted Arrays的C++提交中擊敗了7.44% 的用戶
內存消耗: 21.8 MB, 在Median of Two Sorted Arrays的C++提交中擊敗了0.53% 的用戶

有點垃圾。。。

改進一下:https://blog.csdn.net/hang404/article/details/84786904???

#leetcode刷題之路4-尋找兩個有序數組的中位數