中位数计算

题目

数组中位数

直观思路

想的是如何将两个数组组合起来,也就是将两个有序的数组组合成为一个数组,然后直接计算中位数,将两个数组组合成为一个数组的逻辑上的时间复杂度是\(O(N+M)\),在此基础上我阐释实现了一个算法,但是时间超时了,AC不了,所以需要更加有效的算法,另外需要注意,在程序测试的时候,不能存在数组越界的情况,尤其是条件判断的时候很容易在极端情况之下忽略该条件,使得我们程序变得很难发现错误,所以我们需要做的是,细致再细致。而且本地PC在数组越界处在循环语句的时候,会自动跳过最后的越界情况,导致不能及时发现可能出现的错误,这一点在写题的时候出现了部分错误,需要注意。

综上来看,上面的思路不可取。

本地AC代码

#include<vector>
#include<iostream>
using namespace std;

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        vector<int> num;
        int i = 0,j = 0;
        while(1){
            if(nums1[i]<nums2[j]){
                num.push_back(nums1[i]);
                i++;
            }
            if(i == len1){
                while(j< len2){
                    num.push_back(nums2[j]);
                    j++;
                }
            }
            if(i+j == len1+len2) break;
            if(nums1[i]>nums2[j]){
                num.push_back(nums2[j]);
                j++;
            }
            if(j == len2){
                while(i< len1){
                    num.push_back(nums1[i]);
                    i++;
                }
            }
            if(i+j == len1+len2) break;
        }
        int f_len = num.size();
        int len_f = f_len/2;
        float res = 0;
        if(f_len%2){
            res = (double)num[len_f];
        }
        else{
            res = (double)(num[f_len/2]+num[len_f-1])/2;
        }
        return res;
    }
};

int main(){
    double res;
    vector<int> nums1,nums2;
    Solution solution;
    for(int i = 0; i < 10; i++){
        nums1.push_back(i);
    }
    for(int i = 10; i< 15; i++){
        nums2.push_back(i);
    }
    res = solution.findMedianSortedArrays(nums1,nums2);
    printf("%lf",res);
    return 0;
}

正确思路和题解

采用二分搜索的方法实现的搜索,有点难。。。。
二分思想

posted @ 2021-04-10 01:00  Marvel_Iron_Man  阅读(194)  评论(0编辑  收藏  举报