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 beO(log (m+n)).

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

Subscribe to see which companies asked this question

package temp;

/**
 * 
 * @author Mouse
 *
 */

public class Solution {
	//快速排序
	static int partion(int a[], int left, int right) {
		int key = a[left];
		int i = left;
		int j = right;
		while (i < j) {
			while (a[j] >= key && j > i)
				j--;
			a[i] = a[j];
			while (a[i] <= key && j > i)
				i++;
			a[j] = a[i];
		}
		a[j] = key;
		return i;
	}
	static void QuickSort(int nums2[], int low, int high) {
		

		if (low<high) {
			int middle=partion(nums2, low, high);
			QuickSort(nums2, low, middle-1);
			QuickSort(nums2, middle+1, high);
		}

	}
	public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
		int lenSum = nums1.length + nums2.length;
		if (nums1.length == 0 && nums2.length != 0) {
			if (lenSum % 2 == 0) {
				int t = lenSum / 2;
				if (t <= nums2.length - 1) {// 中位数都在nums1中, 左左
					double data = (nums2[t] + nums2[t - 1]);
					double d = data / 2;
					return d;
				} else {
					double data = (nums2[t - 2] + nums2[t - 3]);
					double d = data / 2;
					return d;
				}

			} else if (lenSum % 2 == 1) {
				return nums2[lenSum / 2];

			}
		}

		if (nums2.length == 0 && nums1.length != 0) {
			if (lenSum % 2 == 0) {
				int t = lenSum / 2;
				if (t <= nums1.length - 1) {// 中位数都在nums1中, 左左
					double data = (nums1[t] + nums1[t - 1]);
					double d = data / 2;
					return d;
				} else {
					double data = (nums1[t - 2] + nums1[t - 1]);
					double d = data / 2;
					return d;
				}

			} else if (lenSum % 2 == 1) {
				return nums1[lenSum / 2];

			}
		}
		// -------------------------------------------------------------
		int i = 0;
		int temp = 0;
		int findMin = 0;
		int flag = 0;
		// nums1数组的排序
		while (i < nums1.length) {
			findMin = nums2[0];
			for (int k = 0; k < nums2.length; k++) {
				if (findMin >= nums2[k]) {
					findMin = nums2[k];
					flag = k;
				}
			}
			System.out.println("findMin=" + findMin + "--" + "flag=" + flag);

			if (nums1[i] >= findMin) {
				temp = nums1[i];
				nums1[i] = nums2[flag];
				nums2[flag] = temp;
				i++;
			} else if (nums1[i] < findMin) {
				i++;
			}

		}
		for (int k = 0; k < nums1.length; k++) {
			System.out.println("[" + k + "]:" + nums1[k]);

		}
		// nums2数组的排序
		QuickSort(nums2,0,nums2.length-1);
		
		// ======================================		
		System.out.println("nums1和nums2的分界线");
		for (int kk = 0; kk < nums2.length; kk++) {
			System.out.println("[" + kk + "]:" + nums2[kk]);
		}

		// ---------------------------------------------------

		if (lenSum % 2 == 0) {// 余数为0说明了,未来的i和j指向不同的位置
			int t = lenSum / 2;
			if (t <= nums1.length - 1) {// 中位数都在nums1中, 左左
				double data = (nums1[t] + nums1[t - 1]);
				double d = data / 2;
				return d;
			} else {
				if (t == nums1.length) {// 左右
					double data = (nums1[nums1.length - 1] + nums2[0]);
					double d = data / 2;
					return d;

				} else if (t > nums1.length && t < nums2.length) {
					double data = (nums2[t - nums1.length] + nums2[t
							- nums1.length - 1]);
					double d = data / 2;
					return d;
				} else {
					double data = (nums2[t - 2] + nums2[t - 1]);
					double d = data / 2;
					return d;
				}
			}

		} else if (lenSum % 2 == 1) {// 余数为1说明了,未来的i和j指向相同的位置
			int t = lenSum / 2;
			if (t < nums1.length) {// 说明中位数在nums1中
				return nums1[t];
			} else {// 说明中位数在nums2中
				return nums2[t - nums1.length];
			}

		}

		return 0;

	}

	public static void main(String[] args) {
		int nums1[] = {3};
		int nums2[] = {1,2};
		double b = findMedianSortedArrays(nums1, nums2);
		System.out.println(b);
	}

}

num2数组使用快排或折半插入排序  仍然出现 下面的:

后来想到一个办法,通俗易懂,代码如下:

package leetcode;

/**
 * 
 * 
 * @author Mouse
 *
 */

public class Solution {
	public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
		double result = 0.0;
		int m = nums1.length;
		int n = nums2.length;
		int total = m + n;
		int A[] = new int[m + n];
		int i = 0;
		int j = 0;
		for (int k = 0; k < total; k++) {
			if (i == m && j < n) {// nums1数组到达末尾
				A[k] = nums2[j];
				j++;
			} else if (j == n) {// nums2数组到达末尾
				A[k] = nums1[i];
				i++;
			} else if (i == m && j == n) {// nums1和nums2都到达末尾
				break;
			} else {
				if (nums1[i] <= nums2[j]) {
					A[k] = nums1[i];
					i++;
				} else {

					A[k] = nums2[j];
					j++;
				}

			}
		}

		for (int j2 = 0; j2 < A.length; j2++) {
			System.out.print(A[j2] + " ");
		}
		System.out.println("");
		// 寻找中位数
		if (total % 2 == 0) {// 偶数个
			int right = total / 2;
			System.out.println("right:" + right);
			int left = right - 1;
			System.out.println("left:" + left);
			double sum = A[left] + A[right];
			result = sum / 2;

		} else {// 奇数个
			int center = total / 2;
			double sum = A[center];
			result = sum;

		}
		return result;
	}

	public static void main(String[] args) {
		int nums1[] = {};
		int nums2[] = {2,3};
		double d = findMedianSortedArrays(nums1, nums2);
		System.out.println(d);

	}

}


大家也可以看看网上的其他做法哦 虽然我还没看得太懂敲打

http://www.cnblogs.com/jessiading/p/3685658.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值