LeetCode 4 题解

简介: LeetCode 4 题解

LeetCode 4 题解



给定两个大小为 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

解题:思路是:归并之后,取中间值


class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len = nums1.length + nums2.length;
        int[] a = new int[len];
        int k = 0;
        for (int i = 0; i < nums1.length; i++) {
            a[k++] = nums1[i];
        }
        for (int i = 0; i < nums2.length; i++) {
            a[k++] = nums2[i];
        }
        mergesort(a, 0, len - 1);
        if (len % 2 == 1) {
            return (double) a[len / 2];
        } else {
            return (double) (a[len / 2 - 1] + a[len / 2]) / 2;
        }
    }
     /**
     * @param a
     * @param i
     * @param length
     */
    private void mergesort(int[] a, int start, int end) {
        if (end > start) {
            int mid = (start + end) / 2;
            mergesort(a, start, mid);
            mergesort(a, mid + 1, end);
            merge(a, start, mid, end);
        }
    }
    /**
     * @param a
     * @param start
     * @param i
     * @param end
     */
    private void merge(int[] a, int start, int mid, int end) {
        // 二分 start -mid 是一个,mid -end 是一个
        int[] b = new int[end + 1];
        int k = start;
        int i, j;
        for (i = start, j = mid + 1; i <= mid && j <= end; k++) {
            if (a[i] < a[j]) {
                b[k] = a[i++];
            } else {
                b[k] = a[j++];
            }
        }
        while (j <= end) {
            b[k++] = a[j++];
        }
        while (i <= mid) {
            b[k++] = a[i++];
        }
        for (int l = start; l <= end; l++) {
            a[start++] = b[l];
        }
    }
}
相关文章
|
6月前
Leetcode contests 93 题解
870. Advantage Shuffle 起始就是hdoj 1502田忌赛马,但要求的结果不一样而已。这里我用了个pair来记录B中每个数字对应的位置。
27 0
|
6月前
Leetcode contests 95 题解
用容斥原理可以计算出一个数字Num之下有多少个A或B的倍数cnt,我们从最大值二分这个数字Num,拿cnt和N做比较来决定二分的走向,最终l和r肯定会收敛到一起,这就是我们要的结果了。 这道题的数值范围不是特别大 ,用long就可以完全满足需求了。
13 0
|
7月前
|
数据安全/隐私保护
[FlareOn6]Overlong 题解
[FlareOn6]Overlong 题解
41 0
|
7月前
NSSCTF doublegame题解
NSSCTF doublegame题解
23 0
|
7月前
|
数据安全/隐私保护
[UTCTF2020]babymips 题解
[UTCTF2020]babymips 题解
33 1
|
7月前
|
数据安全/隐私保护
CrackRTF 题解
CrackRTF 题解
19 0
|
7月前
|
数据安全/隐私保护
[FlareOn5]FLEGGO 题解
[FlareOn5]FLEGGO 题解
26 1
|
Go 数据安全/隐私保护
世上无难事题解
世上无难事题解
61 0
世上无难事题解