[LeetCode] [C++] LeetCode 4 Median of Two Sorted Arrays 有序数组中位数
题目要求
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
LeetCode 4在线测试
问题描述
给定两个有序数组,长度分别为m和n.求这两个有序数组的中位数(可以理解为中间位置,如果数组奇数个数字,
那么返回最终那个,如果数组偶数个数字,那么返回中间两个数字的平均值)。总体运行时间复杂度要求O(log(m+n))
示例1:
nums1 = [1, 3]
nums2 = [2]
中位数就是2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
中位数就是(2 + 3)/ 2 = 2.5
思路分析
用一个新数组存放nums1和nums2合并后的数组。有序数组的合并,最后取出中位数
代码验证
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> numsAll;
for (int i = 0, j = 0; i < nums1.size() || j < nums2.size();) {
if (i < nums1.size()) {
if (j < nums2.size()) {
if (nums1[i] < nums2[j]) {
numsAll.push_back(nums1[i++]);
} else {
numsAll.push_back(nums2[j++]);
}
} else {
numsAll.push_back(nums1[i++]);
}
} else {
numsAll.push_back(nums2[j++]);
}
}
int middle = (nums1.size() + nums2.size()) >> 1;
if ((nums1.size() + nums2.size()) % 2 == 1) {
return (double)numsAll[middle];
} else {
return ((double)numsAll[middle] + (double)numsAll[middle-1]) / 2.0;
}
}
};
总结注意
- 合并逻辑,依次比较两个数组的首元素,小的往新数组里面添加,并将下标向后移动一位
- 计算平均值来获取中间位置是,可以用位运算(右移一位)代替除法操作
int middle = (nums1.size() + nums2.size()) >> 1;
原创声明
作者:hgli_00
链接:http://www.cnblogs.com/lihuagang/p/leetcode_4.html
来源:博客园
著作权归作者所有,转载请联系作者获得授权。