Leetcode练习记录
题目:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
input:nums1=[1,3],nums2=[2] output:2.0
示例 2:
input:nums1=[1,2],nums2=[3,4] output:(2+3)/2.0=2.5
将两个数组中的值按照大小赋值给一个新建数组nums,使用num判断元素个数为奇数还是偶数,使用no定位新建数组nums的中位数,对两数组同时进行扫描,用mid扫描新建数组nums,标志i与j分别数组nums1和nums2,若nums1[i]的值小于nums2[j]的值,则将较小的元素赋值给nums,同时指向该数组的标志后移,若有一数组扫描完毕,另一数组还未结束,则将未结束数组中剩余的元素赋值给nums数组,完成比较,时间复杂度为:nums1与nums2 数组各扫描一次,故时间复杂度为两者长度之和,即O(log(m+n))
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {int length1=nums1.length;
int length2=nums2.length;
int[] nums=new int[length1+length2];
int num=(length1+length2)%2;
int no=(length1+length2)/2;
double result=0.0;
//使用mid记录中位数的位置
int mid=0;
int i=0,j=0;
while(i<length1||j<length2){
if(i<length1&&j<length2){
if(nums1[i]<nums2[j]){
nums[mid]=nums1[i];
i++;
mid++;
}else if(nums1[i]>nums2[j]){
nums[mid]=nums2[j];
j++;
mid++;
}else {
nums[mid]=nums1[i];
i++;mid++;
nums[mid]=nums2[j];
j++;mid++;
}
}else if(i==length1&&j<length2){
nums[mid]=nums2[j];
j++;
mid++;
}else if(i<length1&&j==length2){
nums[mid]=nums1[i];
i++;
mid++;
}
}
if(num==1){
//奇数个
result=nums[no];
}else {
//偶数个
result=(nums[no-1]+nums[no])/2.0;
}
return result;
}
}
要注意返回Result值为Double类型,在除的时候,应该除以2.0,若除以2则会变成整形除法,得到取整之后的值。
有问题还请指出哈