leetcode Median of Two Sorted Arrays 日常打卡

本文介绍了一种寻找两个有序数组中位数的有效算法。通过递归地找到第K小的元素,解决了不同长度数组的中位数问题。算法首先比较两个数组的中间元素,然后排除较小的一半,重复此过程直到找到中位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution {
public:
	double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
		int len1 = nums1.size();
		int len2 = nums2.size();
		int len = len1 + len2;
		if (len %2!=0) {
			return findKth(nums1, 0, nums2, 0, len / 2 + 1);
		}
		return (findKth(nums1, 0, nums2, 0, len / 2) + findKth(nums1, 0, nums2, 0, len / 2 + 1)) / 2;
	}

	double findKth(vector<int>& nums1, int i1, vector<int>& nums2, int i2, int k) {
		if (i1 >= nums1.size()) {
			return nums2[i2 + k - 1];
		}
		if (i2 >= nums2.size()) {
			return nums1[i1 + k - 1];
		}
		if (k == 1) {
			return min(nums1[i1], nums2[i2]);
		}
		int key_1 = i1 + k / 2 - 1 >= nums1.size() ? INT_MAX : nums1[i1 + k / 2 - 1];   //判断开始点是否超过容器里面数的数量
		int key_2 = i2 + k / 2 - 1 >= nums2.size() ? INT_MAX : nums2[i2 + k / 2 - 1];   //超过的话就变为INT_MAX!
		if (key_1 < key_2) {
			return findKth(nums1, i1 + k / 2, nums2, i2, k - k / 2);
		}
		else {
			return findKth(nums1, i1, nums2, i2 + k / 2, k - k / 2);
		}
	}

};

刷题总结:

对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] , 
若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2,
如果我们可以在两个数列中求出第K小的元素,便可以解决该问题不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
 取A[k / 2] B[k / 2] 比较,
 如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
 反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的
 k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
 如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。

 

参考原文:https://blog.youkuaiyun.com/gao1440156051/article/details/51725845 
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值