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);
}
}
大家也可以看看网上的其他做法哦 !虽然我还没看得太懂