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:二分查找法

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

相关推荐
阳洞洞3 天前
leetcode 18. 四数之和
leetcode·双指针
阳洞洞5 天前
leetcode 15. 三数之和
leetcode·双指针
阳洞洞9 天前
leetcode 141. Linked List Cycle
数据结构·leetcode·链表·双指针
阳洞洞9 天前
leetcode 142. Linked List Cycle II
数据结构·leetcode·链表·双指针
卷卷的小趴菜学编程11 天前
算法篇-----滑动窗口
数据结构·算法·双指针·滑动窗口·哈希表·数组相关
懒懒小徐14 天前
华为OD机试真题 Java 实现【水库蓄水问题】
java·算法·华为od·双指针
阳洞洞14 天前
滑动窗口leetcode 209和76
算法·leetcode·双指针·滑动窗口
阳洞洞15 天前
leetcode 977. Squares of a Sorted Array
算法·leetcode·双指针
程序员-King.21 天前
day49—双指针+贪心—验证回文串(LeetCode-680)
算法·leetcode·贪心算法·双指针
程序员-King.24 天前
day48—双指针-通过删除字母匹配到字典最长单词(LeetCode-524)
算法·leetcode·双指针