一.题目描述
NC36在两个长度相等的排序数组中找到上中位数
题目链接:https://www.nowcoder.com/practice/6fbe70f3a51d44fa9395cfc49694404ftpId=196&&tqId=37141&rp=1&ru=/activity/oj&qru=/ta/job-code-total/question-ranking
给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。
上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数
二.算法(无脑暴力)
求上中位数可以将两个数组利用vector进行合并,然后利用sort进行排序,在排序后的数组中找出上中位数,代码如下:
class Solution {
public:
int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
int len = arr1.size()+arr2.size();
int mid=0;
//求出合并后中位数的下标
if(len%2==0){
mid=len/2;
} else {
mid=len/2+1;
}
vector<int>q;//为合并后的新数组
for(int i=0;i<arr1.size();i++) q.push_back(arr1[i]);
for(int i=0;i<arr2.size();i++) q.push_back(arr2[i]);
sort(q.begin(),q.end());//补充一下:sort的复杂度是o(n*logn) 所以这一题也是勉强卡过去了
int ans=0;
ans=q[mid-1];//注意下标要减去1
return ans;
}
};
时间复杂度:o(n*log(n)) 对所以元素遍历,而且sort排序效率可以达到log(n)
空间复杂度:o(n)需要开辟空间存储
优缺点:方便实现 但是空间复杂度高三.算法(双指针)
首先求出上中位数的下标,然后在合并的过程中求出下标对应的数,下面是代码:
class Solution {
public:
/**
* find median in two sorted array
* @param arr1 int整型vector the array1
* @param arr2 int整型vector the array2
* @return int整型
*/
int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
int len = arr1.size()+arr2.size();
int mid=0;
//上中位数的下标
if(len%2==0){
mid=len/2;
} else {
mid=len/2+1;
}
int cnt=0;//表示合并数组的指针
int ans=0;
int a=0,b=0;//a,b分别表示数组arr1,arr2的下标指针
while(cnt!=mid){
if(arr1[a]<=arr2[b]){
ans=arr1[a];
a++;//指针后移
} else{
ans=arr2[b];
b++;//指针后移
}
cnt++;
}
return ans;
}
};时间复杂度:o(n)
空间复杂度:o(1) 不需要额外空间
优缺点:时间复杂度低,但是实现起来复杂

京公网安备 11010502036488号