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 解题思路:
1.将两个数组合并后排序,算法复杂度取决于排序算法的复杂度,比如使用快速排序,算法复杂度NlogN;
2.思路同1,但不对数组排序,因为两个数组已经排序,只需要合并即可,对两个排序数组合并,算法复杂度可到O(n)(合并只需到n/2处即可停止,但不影响复杂度);
3.使用二分查找法。过程分为两个部分:第一部分是使用二分法查找数组中小于某个值的元素的个数;这个结果结合这个值在另一数组中的位置可标识其在整个排序数组中的位置;第二部分则是使用二分法和第一部分的方法遍历数组查找中位数; 代码如下:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int c1 = nums1.size();
        int c2 = nums2.size();
        bool odd = (c1 + c2) %  == ;
        int m1 = FindNth(nums1,nums2,(c1 + c2) / );
        if(!odd)
        {
            int m2 = FindNth(nums1,nums2,(c1 + c2) /  - );
            return (m1 + m2) / 2.0;
        }
        else
        {
            return m1;
        }
    }
    int FindNth(vector<int>& nums1, vector<int>& nums2, int n)
    {
        if(nums1.empty() && nums2.empty())
        {
            return ;
        }
        int left = ;
        int right = nums1.size() - ;
        while(left <= right)
        {
            int md = left + (right - left) / ;
            int r = GetLess(nums2,nums1[md]);
            if(md + r > n)
            {
                right = md-;
            }
            else if(md + r < n)
            {
                left = md + ;
            }
            else
            {
                return nums1[md];
            }
        }
        left = ;
        right = nums2.size() - ;
        while(left <= right)
        {
            int md = left + (right - left) / ;
            int r = GetLess(nums1,nums2[md]);
            if(md + r > n)
            {
                right = md-;
            }
            else if(md + r < n)
            {
                left = md + ;
            }
            else
            {
                return nums2[md];
            }
        }
        return nums2[left]; //针对两个数组中有相同元素的情况,
    }
    int GetLess(vector<int>& nums, int n)
    {
        int left =;
        int right = nums.size()-;
        while(left <= right)
        {
            int mid = left + (right - left) / ;
            if(nums[mid] < n)
            {
                left = mid+;
            }
            else if(nums[mid] > n)
            {
                right = mid-;
            }
            else
            {
                return mid + ;
            }
        }
        return left;
    }
这个解法中需要注意的是在两个数组中有相同元素的情况(一个数组有相同元素不会有问题),比如nums1={1},nums2={1},这种情况下,根据我们使用“当前数组的位置+另一个数组中小于该元素的个数”的方法,则会出现两个相同元素在总数组中位置相同的情况。我们可以这么理解,假设V在总数组中的位置是p,其相同值的另一个元素位置则是p-1,但根据我们的计算方式这两个元素计算的位置结果是一样的,都是p,也就是说我们使用FindNth(nums,p-1)的时候,两个while循环不会返回,即找不到p-1的元素,所以在FindNth中,我们直接返回left指向的指,注意这时left肯定指向相同的元素。
leetcode 4.两个排序数组的中位数的更多相关文章
- LeetCode 4 - 两个排序数组的中位数 - [分治]
		题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 给定两个大小为 m 和 n 的有序数组 n ... 
- LeetCode#5 两个排序数组的中位数
		给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 ... 
- leetcode,两个排序数组的中位数
		先上题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 ... 
- leetcode python两个排序数组的中位数
		给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums2 不同 ... 
- LeetCode(4):两个排序数组的中位数
		Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ... 
- LeetCode4. 两个排序数组的中位数
		4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ... 
- 2.Median of Two Sorted Arrays (两个排序数组的中位数)
		要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ... 
- LeetCode-4. 两个排序数组的中位数(详解)
		链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ... 
- JavaScript实现获取两个排序数组的中位数算法示例
		本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ... 
随机推荐
- python类的特殊成员和方法
			变量或方法 描述 调用时机 __init__ 构造方法 通过类创建对象时,即类名() ,自动触发执行 __doc__ 表示类的描述信息 __module__ 表示当前操作的对象在那个模块 __ ... 
- Flutter实战视频-移动电商-06.Dio基础_Get请求和动态组件协作
			博客地址: https://jspang.com/post/FlutterShop.html#toc-0ee 编写页面代码 创建动态组件HomePage,原来的代码是静态的我们这里就去掉就可以了. 然 ... 
- Weekly Contest 111-------->943. Find the Shortest Superstring(can't understand)
			Given an array A of strings, find any smallest string that contains each string in A as a substring. ... 
- unity 在移动平台中,文件操作路径详解
			今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够更好.更快的掌握,当然,如有不足的地方 欢迎指正!!! 相信大家在开发过程中,难免会保存一些文件在 ... 
- python 如何在 command 中能够找到 其他module
			部分代码如下: __author__ = 'norsd' # coding=utf8 # 上句说明使用utf8编码 try: import os import sys import time #关键语 ... 
- uoj#283. 直径拆除鸡(构造)
			传送门 好神的构造题 vfk巨巨的题解 //minamoto #include<bits/stdc++.h> #define R register #define fp(i,a,b) fo ... 
- [Xcode 实际操作]八、网络与多线程-(23)多线程的同步与异步的区别
			目录:[Swift]Xcode实际操作 本文将演示线程的同步与异步的区别. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 异步线程的运行,是没有按照顺序执行的. ... 
- 【OpenJ_Bailian - 1328】Radar Installation (贪心)
			Radar Installation 原文是English,直接上中文 Descriptions: 假定海岸线是无限长的直线.陆地位于海岸线的一侧,海洋位于另一侧.每个小岛是位于海洋中的一个点.对于任 ... 
- 第一篇 HTML5打包APP之VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)
			1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macOS 10.1 ... 
- sql注入教学
			新手入坑sql注入,以下是笔记 首先本人存在这么一个mysql数据库 爆库 方法一: 先猜有几列 ,,, 数字依次增加,发现有四列,然后通过database()来爆表名 ,, 方法二: 通过构造一个 ... 
