[LeetCode刷题笔记(C语言)]04 - Median of Two Sorted Arrays

题目链接:Median of Two Sorted Arrays
题目原文:
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:

nums1 = [1, 3]
nums2 = [2]
The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

( • ̀ω•́ )✧这是一道红色的hard题,不过不虚…
题目的意思是给你两个从小到大排好序的数组nums1和nums2,要求从中找出二者的中位数。一看到中位数,菜鸡如我只能想起分治(今天打比赛一个非常简单的签到题被我想复杂了,列了好多情况分治还RE结果dalao一个公式AC
(〃´-ω・) 以后窝还是应该想简单一点…)。回到正轨,二分法在这道题里是一个正确的思路。但是这里两个数组,要怎样分才能找到共同的中位数呢?当然如果时间没有限制可以合并成一个数组排序直接输出,但是你看了看你手上的内排时间复杂度:算啦,二分就二分吧。
核心是对二者的中位数进行比较决定返回哪一个.

int nums1_len;
int nums2_len;
int findKthSortedArrays(int * nums1, int candi1, int* nums2, int candi2, int k) {
	int len1, len2;
	int med1, med2;

	if (candi1 >= nums1_len) return nums2[candi2 + k - 1];
	if (candi2 >= nums2_len) return nums1[candi1 + k - 1];
	if (k == 1) return nums1[candi1] < nums2[candi2] ? nums1[candi1] : nums2[candi2];

	med1 = (candi1 + k / 2 <= nums1_len) ? nums1[candi1 + k / 2 - 1] : INT_MAX;
	med2 = (candi2 + k / 2 <= nums2_len) ? nums2[candi2 + k / 2 - 1] : INT_MAX;
	return (med1 < med2) ? findKthSortedArrays(nums1, candi1 + k / 2, nums2, candi2, k - k / 2) : findKthSortedArrays(nums1, candi1, nums2, candi2 + k / 2, k - k / 2);
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
	int med1, med2;
	double ans1, ans2;
	double ans;
	
	nums1_len = nums1Size;
	nums2_len = nums2Size;
	med1 = (nums1Size + nums2Size + 1) / 2;
	med2 = (nums1Size + nums2Size + 2) / 2;
	ans1 = findKthSortedArrays(nums1, 0 ,nums2, 0,med1);
	ans2 = findKthSortedArrays(nums1, 0, nums2, 0, med2);
	ans = (ans1 + ans2) / 2.0;
    
	return ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值