leetcode_Q004: 两个排序数组的中位数__java 实现
问题描述:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
解题思路
解题思想来源:”数据结构”中,对长度分别是m,n的两个有序链表进行合并,该算法的时间复杂度正好是 O(log (m+n))
public class question4 {
public static void main(String[] args) {
int[] nums1 = {1,3};
int[] nums2 = {};
System.out.println(question4.findMedianSortedArrays(nums1,nums2));
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int nums1_len=0;
int nums2_len=0;
if (nums1!=null && nums1.length!=0)
nums1_len=nums1.length;
if (nums2!=null && nums2.length!=0)
nums2_len=nums2.length;
if (nums1_len==0&& nums2_len>0){
if(nums2_len%2==0)
return (nums2[nums2_len/2]+nums2[nums2_len/2-1])/2.0;
else
return nums2[(nums2_len-1)/2]+0.0;
}else if(nums2_len==0&& nums1_len>0){
if(nums1_len%2==0)
return (nums1[nums1_len/2]+nums1[nums1_len/2-1])/2.0;
else
return nums1[(nums1_len-1)/2]+0.0;
}
int[] merge = new int[nums1_len+nums2_len];
int merge_len=0;
int i=0,j=0;
while (i<nums1_len && j<nums2_len){
if(nums1[i]<nums2[j])
merge[merge_len++]=nums1[i++];
else
merge[merge_len++]=nums2[j++];
}
while (i<nums1_len)
merge[merge_len++]=nums1[i++];
while (j<nums2_len)
merge[merge_len++]=nums2[j++];
if(merge_len%2==0)
return (merge[merge_len/2]+merge[merge_len/2-1])/2.0;
else
return merge[(merge_len-1)/2]+0.0;
}
}