`

Leetcode - Median of Two Sorted Arrays

 
阅读更多
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

[分析] 暴力法是简单的,合并后返回中位数。优化的方法是参考http://blog.csdn.net/yutianzuijin/article/details/11499917介绍的解法,awesome! 思路的关键点是将原问题转为寻找两排序数组中第 k 小的数,中位数即为第 (n + m) / 2 小的数, n和m分别为输入中A 和 B 两个数组的长度。
findKth 思路:假设A 和 B长度均不小于 k/2, 比较A[k/2 - 1] 和 B[k/2 - 1]:
(1) A[k/2 - 1] < B[k/2 - 1]
则A的前 k/2个元素是AB合并后的前 k - 1 小的元素中,也即 A[k/2 - 1]不可能是要找的第k个数。反证法证明推断:假设A[k/2 - 1] 在AB合并后出现在第k个元素或以后位置,不妨设就是第k个元素,则 B[k/2 - 1]至少为第 k+1个元素。因为 小于 A[k/2 - 1]至多有 (k/2 - 1) * 2 = k -2 个元素,这与A[k/2 - 1]是合并后第 k个数矛盾,得证。
(2) A[k/2 - 1] > B[k/2 - 1]
分析同(1)。
(3) A[k/2 - 1] = B[k/2 - 1]
则A[k/2 - 1] 就是合并后第 k 个数。
findKth 每次缩小一半规模,时间复杂度是 logk, 因此找寻中位数时间复杂度为 log((m + n) / 2)。

public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int total = nums1.length + nums2.length;
        if ((total & 1) == 0)
            return (findKth(nums1, nums2, 0, 0, total / 2) + findKth(nums1, nums2, 0, 0, total / 2 + 1)) * 1.0 / 2;
        else
            return findKth(nums1, nums2, 0, 0, total / 2 + 1);
    }
    public int findKth(int[] nums1, int[] nums2, int off1, int off2, int k) {
        if (nums1 == null || nums1.length == off1) return nums2[off2 + k - 1];
        if (nums2 == null || nums2.length == off2) return nums1[off1 + k - 1];
        if (k == 1) return Math.min(nums1[off1], nums2[off2]);
        int m = nums1.length - off1;
        int n = nums2.length - off2;
        if (m > n) return findKth(nums2, nums1, off2, off1, k);
        int part1 = Math.min(k / 2, m);
        int part2 = k - part1;
        if (nums1[off1 + part1 - 1] < nums2[off2 + part2 - 1])
            return findKth(nums1, nums2, off1 + part1, off2, k - part1);
        else if (nums1[off1 + part1 - 1] > nums2[off2 + part2 - 1])
            return findKth(nums1, nums2, off1, off2 + part2, k - part2);
        else
            return nums1[off1 + part1 - 1];
    }
}
分享到:
评论

相关推荐

    LeetCode4 Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively. ...Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). Java AC版本

    c语言-leetcode题解04-median-of-two-sorted-arrays.c

    c语言入门 c语言_leetcode题解04-median-of-two-sorted-arrays.c

    java-leetcode题解之Median of Two Sorted Arrays.java

    java java_leetcode题解之Median of Two Sorted Arrays.java

    js-leetcode题解之4-median-of-two-sorted-arrays.js

    js js_leetcode题解之4-median-of-two-sorted-arrays.js

    java-leetcode题解之004-Median-of-Two-Sorted-Arrays

    java入门 java_leetcode题解之004_Median_of_Two_Sorted_Arrays

    leetcode无法登录-MedianOfTwoSortedArrays:双排序数组的中位数

    leetcode 无法登录两个有序数组的中位数 问题 有两个大小分别为 m 和 n 的排序数组 nums1 和 nums2。求两个排序数组的中位数。 整体运行时间复杂度应该是 O(log (m+n))。 您可以假设 nums1 和 nums2 不能都为空。 ...

    leetcode接口-leetcodeHelper:leetcodeHelper

    leetcode 接口 该项目可帮助您使用首选的 IDE 或带有命令行界面 (CLI) 的编辑器来执行 leetcode。 入门 ...leetcode ...leetcode ...two-sum leetcode ...median-of-two-sorted-arrays 然后问题描述和启动代码将自动

    _leetcode-python.pdf

    文档内容目录显示了一系列问题编号和对应的题目,例如“Two Sum”,“Add Two Numbers”,“Median of Two Sorted Arrays”等,这些都是典型的算法和数据结构问题。这些问题涵盖了数组操作、字符串处理、递归、动态...

    leetcode4median-leetcode4-median-:leetcode4-中位数-

    在LeetCode上,题目4(Median of Two Sorted Arrays)是一个经典的算法问题,旨在寻找两个已排序数组的中位数。中位数是将一组数值从小到大排列后处于中间位置的数,在奇数个数的情况下是中间的那个数,而在偶数个数...

    leetcode题库-LeetCode-Go:用GO回答LeetCode

    leetcode题库 LeetCode-Go 理论基础 见Note 脑图 TODO 待填充 算法题 面试高频出现,以及一些非常经典重要的算法题优先 题目列表 No Title Link Solution Acceptance Difficulty Topics Solution 0001 Two Sum 46.1%...

    leetcode-cpp刷题

    - **2.1.5 Median of Two Sorted Arrays** - 求两个有序数组的中位数。 - 实现思路:通过比较两个数组的中间值来逐步缩小查找范围。 - **2.1.6 Longest Consecutive Sequence** - 找出数组中最长的连续子序列。...

    leetcodepython001-leetcode:https://leetcode.com/的解决方案

    leetcode Python 001 力码 ├── Algorithms │  ├── cpp │  │  ├── 001 - Two Sum.cpp │  │  ├── 002 - Add Two Numbers.cpp │  │  ├── 003 - Longest Substring Without Repeating ...

    leetcode-master.zip

    4. "004_median_of_two_sorted_arrays":这个题目是“寻找两个有序数组的中位数”。需要在两个已排序的数组中找到中位数,如果两个数组合并后的数组有偶数个元素,中位数就是中间两个数的平均值。这个问题通常用二分...

    分割数组求最大差值leetcode-Leetcode-Road:LeetCode刷题记录

    分割数组求最大差值leetcode LeetCode 学习之路 记录自己完成LeetCode的代码和结果。 序号 中文名称 英文名称 通过率 难度 1 Two Sum 47.0% 简单 2 Add Two Numbers 36.0% 中等 3 Longest Substring Without ...

    lrucacheleetcode-leetcode-1:leetcode-1

    Median of Two Sorted Arrays 求两有序数列的中位数,可泛化为求两有序数列的第k位数,二分法 5. Longest Palindromic Substring 最长回文子串,补符号,记忆 6. ZigZag Conversion 观察规律 7. Reverse Integer ...

    leetcode实现strstr-leetcode-js:js刷leetcode

    leetcode实现strstr leetcode-js 记录刷leetcode分析过程,希望一点点进步! leetcode地址 刷题顺序 按照顺序刷第一遍,记录实现思路,自己的优化方案,并研究高票大佬的思路。 已完成题目归档 序号 题目 题解 实现...

    程序员面试宝典LeetCode刷题手册

    4. Median of Two Sorted Arrays 7. Reverse Integer 9. Palindrome Number 11. Container With Most Water 13. Roman to Integer 15. 3Sum 16. 3Sum Closest 17. Letter Combinations of a Phone Number 18. 4Sum ...

    leetcode中国-LeetCode-Swift:LeetCode算法题Swift实现

    leetcode中国 LeetCode-Swift LeetCode算法题Swift实现 从2020年6月10日开始挑战每日刷算法,至少完成一道,让我们拭目以待! No. Title Chinese Difficulty Router 0001 Two Sum Easy 0002 Add Two Numbers Medium ...

    算法-leetcode-剑指offer上的题很多

    - **寻找数组中的中位数(Median of Two Sorted Arrays)**: 在两个排序数组中找到中位数。 - **快速选择算法(Kth Largest Element)**: 选择一个无序数组中的第k大的元素。 #### 二分搜索扩展 - **二分搜索变体(First...

    leetcode分类-LeetCodeSrc:力扣

    leetcode分类LeetCodeSourceCodes###LeetCode1TowSum如果数组是有序的,O(n)的时间复杂度就可以解决了,现在是无序的,一开始要排一下序###LeetCode2MedianofTwoSortedArrays让用logn的时间复杂度,用了两个二分,...

Global site tag (gtag.js) - Google Analytics