[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.0

Example 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;
        }

    }
};

运行结果

总结注意


  1. 合并逻辑,依次比较两个数组的首元素,小的往新数组里面添加,并将下标向后移动一位
  2. 计算平均值来获取中间位置是,可以用位运算(右移一位)代替除法操作
int middle = (nums1.size() + nums2.size()) >> 1;

原创声明


作者:hgli_00
链接:http://www.cnblogs.com/lihuagang/p/leetcode_4.html
来源:博客园
著作权归作者所有,转载请联系作者获得授权。

posted @ 2017-04-21 15:45  hgli_00  阅读(566)  评论(0编辑  收藏  举报