leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log
一、概述:
这道题思路其实蛮简单的,就是边界太难考虑了,所以一直没能通过,写了好长的代码考虑边界,然后看到一个大神写的代码:
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/c-er-fen-cha-zhao-by-da-li-wang/ 。简直是叹为天人,敬佩不已,发现自己走的路还很长。
二、思路:
由于是两个排序的数组,只要两个数组的间距为保持为总长的一半,二分遍历较短的数组,然后通过一半思路去求另一个数组的位置,比较数组的左边是否小于另一数组当前节点,如果是,找到中位数的位置。
特别需要注意的是,在较长的数组上一定存在一个中位数。
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {if (nums1.size() > nums2.size())return findMedianSortedArrays(nums2, nums1);int M = nums1.size();int N = nums2.size();int l = 0;int r = M;while (l <= r) {int mid = (r - l) / 2 + l;int rightPos = (N + M) / 2 - mid;int max1 = (mid - 1 >= 0) ? nums1[mid - 1] : INT_MIN;int min1 = (mid < M) ? nums1[mid] : INT_MAX;int max2 = (rightPos - 1 >= 0) ? nums2[rightPos - 1] : INT_MIN;int min2 = (rightPos < N) ? nums2[rightPos] : INT_MAX;if (max1 > min2) { //如果num1[mid]左边的数大于右边指向的数,中位数左移r = mid - 1;}else if (max2 > min1) { //如果num1[mid]右边的数大于左边指向的数,中位数右移l = mid + 1;}else {l = r = mid;break;}}int u = l; //指向nums1对应的中位数位置int v = (M + N) / 2 - l; //指向中位数右边对应中位数的位置int low = max(u - 1 >= 0 ? nums1[u - 1] : INT_MIN,v - 1 >= 0 ? nums2[v - 1] : INT_MIN);int high = min(u < M ? nums1[u] : INT_MAX,v < N ? nums2[v] : INT_MAX);if ((N + M) % 2 == 1)return high;return float(low + high) / 2;
}
leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log相关推荐
- python两个数组合并、找出中位数_leetcode刷题记录-找出这两个有序数组的中位数(python版本)...
谨以此文记录一下自己刷题的过程,虽然技术能力一般,相信刷完整套题目自己的编程能力定会有提高,代码都是个人创作,不一定是最好的,仅供参考和交流 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...
- Leetcode04--给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
文章目录 题目 一.归并算法 二.二分查找法 题目 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度 ...
- LeetCode3:合并两个有序数组 给你两个有序数数组,nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组.
合并两个有序数组 问题描述: 给你两个有序数数组,nums1和nums2,请你将nums2合并到nums1中,使nums1成为一个有序数组. 说明: 初始化nums1和nums2的元素数量分别为m和n ...
- Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素
本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...
- 一个数组中,除两个元素其余都出现了两次,找出这两个元素
为什么80%的码农都做不了架构师?>>> 本文为转载,原文地址是:http://blog.csdn.net/morewindows/article/details/821400 ...
- 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值输入 [1,3,5,7,9,11] 10输出 1,9 3,7 代码: import java.util.HashMap; import java ...
- 一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次,找出这两个数字
题目:一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次. 找出这两个数字,编程实现. 参考代码: #include<stdio.h> #include <windows. ...
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次.编写一个函数找出这两个只出现一次的数字. 1.代码编写 2.结果 1.代码编写 代码如下(示例): #define _CRT_SECURE_ ...
最新文章
- 使用动态代理,提高工作效率
- Spring.net 类库目录
- Java数组的十大方法
- HTTP网页请求响应的状态码/状态代码
- 持续集成之 Spring Boot 实战篇
- java标识语_Java 基本语法,标识符,修饰符,关键字
- 初学者参考C#中操作XML修改完整版
- Linux下安装和卸载jdk及环境配置
- 东芝固态硬盘升级工具下载(软件+DMG)
- 【贵州大学计算机考研1】三本学生考研上岸贵州大学软件工程专硕(附带真题与答案)
- C#中背景图片布局设置
- GTX 1070Ti正式发布!iGame Vulcan X家族再添新成员
- 鸿蒙os手机评测视频,鸿蒙OS正式发布:荣耀智慧屏首发,一起来体验鸿蒙OS吧
- 瞧一瞧~看一看~MyCat架构剖析免费不要钱!(下)
- join()方法的作用
- 清华博士导师整理:Tensorflow 和 Pytorch 的笔记(包含经典项目实战)
- 计算机 计算能力测试题,高中数学计算能力训练题.doc
- 《边缘云计算技术及标准化白皮书》
- python伪造邮件发件地址_python-SMTPSenderRefused-553,发件人地址未经验证-Django电子邮件表格...
- 遗忘的国度-梦幻西游(男人的中庸之道)