Median of Two Sorted Arrays

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值