在C++中查找两个排序列表的中位数的程序
假设我们有两个排序列表。我们必须找到这两个列表的中位数。因此,如果数组类似于[1,5,8]和[2,3,6,9],那么答案将是5。
为了解决这个问题,我们将按照以下步骤操作:
定义一个函数solve(),这将需要一个数组nums1,一个数组nums2,
如果nums1的大小>nums2的大小,则:
返回解决(nums2,nums1)
x:=nums1的大小,y:=nums2的大小
低:=0,高:=x
总长度:=x+y
当低<=高时,请执行以下操作:
高:=partitionX-1
如果totalLengthmod2与0相同,则:
否则
return((maxLeftX和maxLeftY的最大值)+(minRightX和minRightY的最小值))/2
返回maxLeftX和maxLeftY的最大值
partitionX:=低+(高-低)
partitionY:=(totalLength+1)/2-partitionX
maxLeftX:=(如果partitionX与0相同,则为-inf,否则为nums1[partitionX-1])
minRightX:=(如果partitionX与x相同,则为inf,否则为nums1[partitionX])
maxLeftY:=(如果partitionY与0相同,则为-inf,否则为nums2[partitionY-1])
minRightY:=(如果partitionY与y相同,则为inf,否则为nums2[partitionY])
如果maxLeftX<=minRightY且maxLeftY<=minRightX,则:
否则当maxLeftX>minRightY时,则:
否则
返回0
让我们看下面的实现来更好地理解:
示例
#include
using namespace std;
class Solution {
public:
double solve(vector& nums1, vector& nums2) {
if(nums1.size()>nums2.size())
return solve(nums2,nums1);
int x = nums1.size();
int y = nums2.size();
int low = 0;
int high = x;
int totalLength = x+y;
while(low<=high){
int partitionX = low + (high - low)/2;
int partitionY = (totalLength + 1)/2 - partitionX;
int maxLeftX = (partitionX ==0?INT_MIN:nums1[partitionX-1] );
int minRightX = (partitionX == x?INT_MAX : nums1[partitionX]);
int maxLeftY = (partitionY ==0?INT_MIN:nums2[partitionY-1] );
int minRightY = (partitionY == y?INT_MAX : nums2[partitionY]);
if(maxLeftX<=minRightY && maxLeftY <= minRightX){
if(totalLength% 2 == 0){
return ((double)max(maxLeftX,maxLeftY) + (double)min(minRightX,minRightY))/2;
}
else{
return max(maxLeftX, maxLeftY);
}
}
else if(maxLeftX>minRightY)
high = partitionX-1;
else low = partitionX+1;
}
return 0;
}
};
main(){
Solution ob;
vector v1 = {1,5,8}, v2 = {2,3,6,9};
cout << (ob.solve(v1, v2));
}输入
[1,5,8], [2,3,6,9]输出结果
5