力扣题(3):寻找两个正序数组的中位数
官方的答案我勉强可以知道思路,但是让我敲代码我敲不出来,我只能做出来两个时间复杂度比较高的方法来完成这道题,具体的算法后续再看能不能更深层次的进行理解再更新吧:
package test004;
import java.util.Arrays;
public class findArraysMidNumber {
public static void main(String[] args) {
int[] nums1 = {1,3,3};
int[] nums2 = {2,4,9};
System.out.println(findMedianSortedArrays(nums1, nums2));
System.out.println(findMedianSortedArrays2(nums1, nums2));
}
/**
* 方法一:指针定位
*/
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n1 = nums1.length,n2 = nums2.length;
//给两个数组定义指针
int k1 = 0,k2 = 0;
//中间数和中间数之前的数
int pre = 0,current = 0;
int totalLength = n1+n2;//总长度
int middleIndex = totalLength/2;//因为索引是从0开始,所以不用考虑加一
//遍历到中间数
for (int i = 0; i <= middleIndex; i++) {
//比较两个数组的相应位置的数字大小
//那个数组的数字更小
if (k1<n1 && (k2>=n2 || nums1[k1]<nums2[k2])){
//就将那个数组指针当前指向的数字赋值给current
current = nums1[k1];
k1++;
}else {
current = nums2[k2];
k2++;
}
}
//判断奇偶数
if (totalLength%2 == 0){//偶数
return (pre+current)/2.0;
}else {
return current;
}
}
/**
* 方法二:合并数组
*/
public static double findMedianSortedArrays2(int nums1[],int nums2[]){
int ints[] = Arrays.copyOf(nums1,nums1.length+nums2.length);
/**arraycopy()方法参数的概述
* src:这是源数组,也就是要从哪个数组中复制元素。它是一个 Object 类型的参数,意味着可以传入任意类型的数组,如 int[]、char[]、String[] 等。
* srcPos:表示源数组中开始复制元素的起始位置,索引从 0 开始计数。
* dest:目标数组,即元素要复制到的数组。同样,它也是 Object 类型的参数,并且目标数组的类型要和源数组的类型兼容。
* destPos:目标数组中开始粘贴元素的起始位置,索引同样从 0 开始。
* length:要复制的元素个数。
*/
System.arraycopy(nums2,0,ints,nums1.length,nums2.length);
//通过Arrays.copyOf和System.arraycopy完成两个数组的合并
//排序
Arrays.sort(ints);
//判断奇偶
int middleIndex = ints.length/2;
if (ints.length%2 == 0){//偶数
return (ints[middleIndex]+ints[middleIndex-1])/2.0;
}else {//奇数
return ints[middleIndex]/2.0;
}
}
}
都写在注释里面了,二分法和二分边界分割法我后续再更新。