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];
        }
    }
}
相关文章
|
7月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
35 0
|
7月前
leetcode-827:最大人工岛
leetcode-827:最大人工岛
66 0
|
算法 Python
LeetCode 386. Lexicographical Numbers
给定一个整数 n, 返回从 1 到 n 的字典顺序。
91 0
LeetCode 386. Lexicographical Numbers
LeetCode 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
90 0
|
算法
leetcode第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
108 0
leetcode第56题
leetcode第44题
时间复杂度:text 长度是 T,pattern 长度是 P,那么就是 O(TP)。 空间复杂度:O(TP)。 同样的,和第10题一样,可以优化空间复杂度。
leetcode第44题
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
110 0
leetcode第34题
|
机器学习/深度学习
leetcode第50题
求幂次方,用最简单的想法,就是写一个 for 循环累乘。 至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了 double mul = 1; if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; } } else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul; }
leetcode第50题
leetcode第19题
上边我们遍历链表进行了两次,我们如何只遍历一次呢。 看了 leetcode 的讲解。 想象一下,两个人进行 100m 赛跑,假设他们的速度相同。开始的时候,第一个人就在第二个人前边 10m ,这样当第一个人跑到终点的时候,第二个人相距第一个人依旧是 10m ,也就是离终点 10m。 对比于链表,我们设定两个指针,先让第一个指针遍历 n 步,然后再让它俩同时开始遍历,这样的话,当第一个指针到头的时候,第二个指针就离第一个指针有 n 的距离,所以第二个指针的位置就刚好是倒数第 n 个结点。
leetcode第19题