java 两个有序数组求中位数_递归分治_LeetCode_04

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 两个有序数组求中位数_递归分治_LeetCode_04相关的知识,希望对你有一定的参考价值。


public class Test2 {
	
	// 注意一些特殊情况如([],[1]),([1],[1]),([],[])
	public double solve(int[] nums1, int[] nums2) {
		int m = nums1.length;
		int n = nums2.length;
		int totalLength = m + n;
		int k = (m + n) / 2;
		
		if (m == 0 && n == 0) {return 0;}
		if (m == 0)  return (totalLength % 2  == 0 ? (nums2[k]+nums2[k-1])/2.0 : nums2[k]);
		 
		if (n == 0) return (totalLength % 2  == 0 ? (nums1[k]+nums1[k-1])/2.0 : nums1[k]);
		
		if (totalLength % 2 == 0) {
			// 偶数 后面要除以2.0才能转换成double
			return (recur(nums1, nums2, 0, 0, m, n, k) + recur(nums1, nums2, 0, 0, m, n, k+1)) / 2.0;
		} else {
			return recur(nums1, nums2, 0, 0, m, n, k+1);
		}
	}
	
	// **区分第几个和索引的关系**
	// 代表某一次递归, len1是较短的序列。k表示第k个,而不是索引
	// k最小取值为1,表示第一个
	public double recur(int[] nums1, int[] nums2, int start1, int start2, int len1, int len2, int k) {
		if (len1 > len2) {
			return recur(nums2, nums1, start2, start1, len2, len1, k);
		}
		
		// 递归终止条件
		if (len1 == 0) {
			return nums2[start2 + k - 1];
		}
		
		if (k == 1) {
			return Math.min(nums1[start1], nums2[start2]);
		}
		
		// 区分索引和第几个,p,q代表第几个
		// p + q = k - 1 两个序列下一个位置较小的一个即为所求
		int p = Math.min(k/2, len1);
		int q = k - p;
		
		if (nums1[start1 + p - 1] < nums2[start2 + q - 1]) {
			return recur(nums1, nums2, start1 + p, start2, len1 - p, len2, k - p);
		} else if (nums1[start1 + p - 1] > nums2[start2 + q - 1]) {
			return recur(nums1, nums2, start1, start2 + q, len1, len2 - q, k - q);
		} else {
			// 返回下一个位置较小的
			return nums1[start1 + p - 1];
		}
	}

}

以上是关于java 两个有序数组求中位数_递归分治_LeetCode_04的主要内容,如果未能解决你的问题,请参考以下文章

算法作业!!求两个不等长有序数组的中位数!

算法笔记_065:分治法求逆序对(Java)

找两个有序数组的中位数的几种方式

leet

求两个有序数列的合并——分治算法

递归打卡1在两个长度相等的排序数组中找到上中位数