Median of Two Sorted Arrays

来源:互联网 发布:金蝶软件建账流程 编辑:程序博客网 时间:2024/06/09 13:33
package leetcode.xuyi;import org.junit.Test;/** * Created by ethan on 2015/5/4. */public class MedianOfTwoSortedArrays {    // 思路1: 由于时间复杂度限制在O(log(m+n)),只能使用二分法    // 其实这道题可以一般化到求最小的第n位数    public double findMedianSortedArrays(int[] nums1, int[] nums2) {        int len = nums1.length + nums2.length;        if ((len&0x1)==1)            return findMedian(nums1, 0, nums2, 0, len/2+1);        else            return (findMedian(nums1, 0, nums2, 0, len/2)+findMedian(nums1, 0, nums2, 0, len/2+1))/2.0;    }    public double findMedian(int[] nums1, int start1, int[] nums2, int start2,  int target){        // 判断参数        int len1 = nums1.length - start1;        int len2 = nums2.length - start2;        if (len1 > len2)            // return 关键字不能少啊。。。 调了一个小时啊,妈蛋            return findMedian(nums2, start2, nums1, start1, target);        if (len1 == 0) {            return nums2[start2 + target - 1];        }        if (target == 1){            return  Math.min(nums1[start1], nums2[start2]);        }        int pa = Math.min(target/2, len1);        int pb = target - pa;        if(nums1[start1+pa-1] < nums2[start2+pb-1]){            return findMedian(nums1, start1+pa, nums2, start2, target-pa);        }else  if (nums1[start1+pa-1] > nums2[start2+pb-1]){            return findMedian(nums1, start1, nums2, start2+pb, target-pb);        }else            return nums1[start1+pa-1];    }    // 思路2: 先排序,O(m+n) 显然不能满足O(log(m+n)的要求) 但是能Accepted    public double findMedianSortedArrays1(int[] nums1, int[] nums2) {        if (nums1.length == 0 && nums2.length==0)            return 0;        int cur_1 = 0;        int cur_2 = 0;        int[] ans = new int[nums1.length+nums2.length];        int index = 0;        while(cur_1< nums1.length && cur_2<nums2.length){            if (nums1[cur_1] < nums2[cur_2]){                ans[index++] = nums1[cur_1];                cur_1++;            }else {                ans[index++] = nums2[cur_2];                cur_2++;            }        }        while (cur_1< nums1.length){            ans[index++] = nums1[cur_1];            cur_1++;        }        while (cur_2< nums2.length){            ans[index++] = nums2[cur_2];            cur_2++;        }        int len = ans.length;        if (len%2 == 0)            return (ans[len/2] + ans[len/2-1])/2.0;        else            return ans[len/2];    }    @Test    public void test4(){        System.out.println(findMedianSortedArrays(new int[]{2}, new int[]{}));    }}

0 0