题目地址: https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
public class Solution {
@Test
public double findMedianSortedArrays(int[] nums1,int[] nums2 ) {
int m=nums1.length;
int n=nums2.length;
int[] nums3=new int[m+n];//记录两个传入数组长度,并创建数组3大小为提供数组大小之和
int i=0; //将两个数组合并存放如数组3
for(;i<m;i++){
nums3[i]=nums1[i];
}
for(int j=0;j<n;j++){
nums3[i+j]=nums2[j];
}
int mn=m+n; //使用冒泡排序,给数组3从头到尾排序
for(int x=0;x<mn;x++){
for(int y=x+1;y<mn;y++){
if(nums3[x]<nums3[y]){
int temp=nums3[y];
nums3[y]=nums3[x];
nums3[x]=temp;
}
}
}
int flag=-1; //设置标识符
int head=0,tail=m+n-1; //设置首尾指针,分别从数组的 首和尾 向中间靠拢
for(; ;head++,tail-- ){
if(head==tail){ //如果两个指针重合,标志符号设置为1,二者重合,首尾指针都可表示中位数
flag=1;
break;
}
if(head==tail-1){ //如果两个指针紧挨着,那么中位数为这两个数之和除以2
flag=2;
break;
}
}
if(flag==1){
System.out.println(nums3[head]); //情况1,直接取出中位数
}
if (flag==2){ //情况2,小数格式保存二者之和后除以2就是中位数
double r1=nums3[head];
double r2=nums3[tail];
System.out.println((r1+r2)/2);
}
return 0; //程序结束
}
}
统计给定两个数组的长度,并创建出第三个数组存放两个数组的内容
给数组3排序
创建首尾指针同时向数组中间靠拢
(1)情况1 中位数为首尾指针重叠处下标---直接取出中位数
(2)情况2 首尾指针在中间相邻处停止---中间两个数之和再除以2
数组的合并
首尾指针向中间靠拢的停止条件
标签: 数组
推荐阅读: