算法题,c++,动态规划,寻找两个有序数组的中值,双迭代器扫描,时间复杂度O(m+n),空间复杂度O(1)

算法题,c++,动态规划,寻找两个有序数组的中值,双迭代器扫描,时间复杂度O(m+n),空间复杂度O(1)

使用的是双迭代器扫描的方法,时间复杂度O(m+n),空间复杂度O(1)。
代码块中注释显示不清晰,就把代码直接贴一下。

//双迭代器扫描法,时间复杂度O(m+n),空间复杂度O(m+n)
double findMedianSortedArrays(vector& nums1, vector& nums2)
{
//定义用于返回的中位数,定义时就初始化为0
double douMedian = 0;

//数字总个数,定义时就初始化
int iNumOfValue = nums1.size() + nums2.size();

//数字个数是否为偶数,偶数个数字的中位数未中间两个相加除以2,定义时就初始化,假定未偶数个
bool bIsEven = true;

//中位数所在位置,定义时初始化为0
int iPosOfMedian = 0;

//确定中位数所在位置的值,以及总数为偶数还是奇数
//这里获得的位置是中位数的前一位,因为整数相除小数位会被抛弃而非进1,后面在循环中需要+1
if (0 == iNumOfValue)
{
	return iPosOfMedian;
}
else if (iNumOfValue % 2 == 0)
{
	iPosOfMedian = iNumOfValue / 2;
}
else
{
	iPosOfMedian = iNumOfValue / 2;
	bIsEven = false;
}

//双迭代器
vector<int>::iterator itNums1 = nums1.begin();
vector<int>::iterator itNums2 = nums2.begin();

//双值保存中位数的值,第二个值时刚被扫描到的值,第一个值是前面被扫描到的值
double douValue1 = 0;
double douValue2 = 0;

//使用循环直到到达中位数,因在前面的计算中小数位被抛弃而非进1,所以需要加一位
//总数为偶数时,中位数为两个值的平均值,总数为奇数时,中位数为后一个值
for (int i = 0; i < (iPosOfMedian + 1); ++i)
{
	if ((itNums1 != nums1.end()) && (itNums2 != nums2.end()))
	{
		if (*itNums1 <= *itNums2)
		{
			douValue1 = douValue2;
			douValue2 = *itNums1;
			++itNums1;
		}
		else
		{
			douValue1 = douValue2;
			douValue2 = *itNums2;
			++itNums2;
		}
	}
	else if (itNums1 == nums1.end())
	{
		douValue1 = douValue2;
		douValue2 = *itNums2;
		++itNums2;
	}
	else
	{
		douValue1 = douValue2;
		douValue2 = *itNums1;
		++itNums1;
	}
}

//得到了位于中间的两个值,通过判断总数是否是耦合,对中位数进行计算
//总数为偶数时,中位数为两个值的平均值,总数为奇数时,中位数为后一个值
if (bIsEven)
{
	douMedian = (douValue1 + douValue2) / 2;
}
else
{
	douMedian = douValue2;
}
return douMedian;

}

int main()
{
//func();
vector vec1{1,2,3,4,5,6,7};
vector vec2{ 110,111,112,123,134,145,156,167,178,189,190};
cout << findMedianSortedArrays(vec1, vec2);
return 0;
}

//双迭代器扫描法,时间复杂度O(m+n),空间复杂度O(m+n)
double findMedianSortedArrays(vector<int>& nums1, vector<int>&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值