Leecode热题100---二分查找--4:寻找两个正序数组的中位数

题目

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。


解法1、暴力解法(归并)

思路:

合并 nums1,nums2 为第三个数组

排序第三个数组

按下标,找出中位数

cpp 复制代码
class Solution
{
public:
	double findMedianSortedArrays(vector<int>& nums1,vector<int>& nums2)
	{
		int m = nums1.size(), n = nums2.size(), k=0, i=0, j=0;
		vector<int> result(m+n,0);
		while(i<m && j<n)
		{
			if(nums1[i] < nums2[j])
			{
				result[k] = nums1[i];
				i++;
			}
			else
			{
				result[k] = nums2[j];
				j++;
			}
			k++;
		}

		// nums1或nums2有一个已经遍历完
		while(i<m)
		{
			result[k] = nums1[i];
			i++;
			k++;
		}
		while(j<n)
		{
			result[k] = nums2[j];
			j++;
			k++;
		}
		// %:取余,判断奇偶
		return k % 2 ? result[k/2]:(result[k/2]+result[k/2-1])/2.0;
	}
};

解法2、双指针法
思路

申请2个指针,分别指向2个数组的头

每次比较大小来移动 2个指针

指针移动的次数与(m + n) / 2 相同时,得到中位数

注意边界问题:

2个指针在移动时,是否有超过2个数组的最大个数;

如果有,后续就只能移动另一个指针

cpp 复制代码
class Solution
{
public:
	double findMedianSortedArrays(vector<int>& nums1,vector<int>& nums2)
	{
		int m = nums1.size(), n = nums2.size(),i=0, j=0, L=0, R=0;
		for(int x = 0;x <= (m+n)/2; x++)
		{
			L = R;
			if(i<m && (j >= n || nums1[i] < nums2[j]))	// j >= n:包含了边界问题
			{
				R = nums1[i];
				i++;
			}
			else
			{
				R = nums2[j];
				j++;
			}
		}
		// % 取余,为1是奇数,R值为中位数,L为其上一个数;为0是偶数,R/L为中位数两端的数
		return (m+n)%2 ? R: (R+L)/2.0;
	}	
};

解法3:二分查找法

此题用二分查找法不好理解,放弃;
建议使用暴力归并法和双指针法解题

相关推荐
燃于AC之乐1 天前
《算法实战笔记》第10期:六大算法实战——枚举、贪心、并查集、Kruskal、双指针、区间DP
算法·贪心算法·图论·双指针·区间dp·二进制枚举
睡不醒的kun3 天前
不定长滑动窗口-求子数组个数
数据结构·c++·算法·leetcode·职场和发展·双指针·滑动窗口
伟大的车尔尼4 天前
双指针题目:复写零
双指针
拾光Ծ5 天前
【优选算法】双指针算法:专题二
c++·算法·双指针·双指针算法·c++算法·笔试面试
艾莉丝努力练剑8 天前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
老鼠只爱大米10 天前
LeetCode经典算法面试题 #24:两两交换链表中的节点(迭代法、递归法等多种实现方案详细解析)
算法·leetcode·链表·递归·双指针·迭代·链表交换
沉默-_-10 天前
力扣hot100双指针专题解析2(C++)
java·c++·算法·蓝桥杯·双指针
老鼠只爱大米10 天前
LeetCode经典算法面试题 #19:删除链表的倒数第N个结点(双指针、栈辅助法等多种实现方案详细解析)
算法·leetcode·链表·双指针·删除链表节点·一趟扫描
2401_8414956411 天前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针
老鼠只爱大米13 天前
LeetCode经典算法面试题 #160:相交链表(双指针法、长度差法等多种方法详细解析)
算法·leetcode·链表·双指针·相交链表·长度差法