在这和大家分享一个刷题网站,对于提高编程能力很有用。
LeetCode
问题描述:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
解体思路:先将两个数组合并后再找中位数;此处的数组合并过程类似于归并排序,有不懂的可以去看看归并排序的内容
示例1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
LeetCode执行结果!总的来看执行的时间还是很可以
直接上代码吧
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int index1 = 0;//第一个数组的索引
int index2 = 0;//第二个数组的索引
int index = 0;//合并数组的索引
int [] result = new int[nums1.length+nums2.length];//创建一个数组,合并连个数组
if(nums1.length == 0){//如果nums1为空,合并后的数组为nums2
result = nums2;
}else if(nums2.length == 0){//如果nums2为空,合并后的数组为nums1
result = nums1;
}else{//两个数组都不为空,则遍历
while(index1 != nums1.length && index2 != nums2.length){//以最短的数组的索引为结束条件
//该循环的过程类似于归并排序
if(nums1[index1]<nums2[index2]){//保证合并后的数组仍是有序的则要比较两个数组的每一项
result[index++] = nums1[index1++];
}else{
result[index++] = nums2[index2++];
}
}
if(index1 < nums1.length){//如果nums1没遍历完,则继续遍历nums1
while(index1!=nums1.length){
result[index++] = nums1[index1++];
}
}else if(index2 < nums2.length){//如果nums2没遍历完,则继续便利nums2
while(index2!=nums2.length){
result[index++] = nums2[index2++];
}
}else{
;
}
}
//根据合并后的数组的长度求中位数
if(result.length>2){
int mid = result.length/2;
if(result.length%2==0){
double zws = ((result[mid-1]+(result[mid]))/2.0);
return zws;
}else{
double zws = result[mid];
return zws;
}
}else if(result.length == 2){
double zws = (result[0]+result[1])/2.0;
return zws;
}else if(result.length==1){
double zws = result[0];
return zws;
}else{
double zws = 0;
return zws;
}
}