leetcode-4

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

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:输入:nums1 = [1,3], nums2 = [2]  输出:2.00000  解释:合并数组 = [1,2,3] ,中位数 2

示例 2:输入:nums1 = [1,2], nums2 = [3,4]  输出:2.50000  解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

提示:nums1.length == m  nums2.length == n  0 <= m <= 1000  0 <= n <= 1000  1 <= m + n <= 2000  -106 <= nums1[i], nums2[i] <= 106

 

推导:

 

代码:

 1 class Solution {
 2 public:
 3     int getKthElement(const vector<int>& nums1, const vector<int>& nums2, int k) {
 4 
 5         int m = nums1.size();
 6         int n = nums2.size();
 7         int index1 = 0, index2 = 0;
 8 
 9         while (true) {
10             // 边界情况
11             if (index1 == m) {
12                 return nums2[index2 + k - 1];
13             }
14             if (index2 == n) {
15                 return nums1[index1 + k - 1];
16             }
17             if (k == 1) {
18                 return min(nums1[index1], nums2[index2]);
19             }
20 
21             // 正常情况
22             int newIndex1 = min(index1 + k / 2 - 1, m - 1);
23             int newIndex2 = min(index2 + k / 2 - 1, n - 1);
24             int pivot1 = nums1[newIndex1];
25             int pivot2 = nums2[newIndex2];
26             if (pivot1 <= pivot2) {
27                 k -= newIndex1 - index1 + 1;
28                 index1 = newIndex1 + 1; 
29             }
30             else {
31                 k -= newIndex2 - index2 + 1;
32                 index2 = newIndex2 + 1;
33             }
34         }
35     }
36 
37     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
38         int totalLength = nums1.size() + nums2.size();
39         if (totalLength % 2 == 1) {
40             return getKthElement(nums1, nums2, (totalLength + 1)/2);
41         }
42         else {
43             return (getKthElement(nums1, nums2, totalLength/2) + getKthElement(nums1, nums2, totalLength/2 + 1)) / 2.0;
44         }
45     }
46 };

 

posted @ 2024-07-27 12:22  路人呃呃  阅读(12)  评论(0)    收藏  举报