PAT 2-13. 两个有序序列的中位数(25)
题目链接:http://www.patest.cn/contests/ds/2-13
解题思路及代码如下:
/*
解题思路:
分别求出序列A 和B 的中位数,设为a 和b,求序列A 和B 的中位数过程如下:
1)若a=b,则a 或b 即为所求中位数,算法结束。
2)若a<b,则舍弃序列A中较小的一半(如果A长度为奇数则保留a,如果为偶数则不保留a),同时舍弃序列B中较大的一半,要求舍弃的长度相等;
3)若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半(如果B长度为奇数则保留b,如果为偶数则不保留b),要求舍弃的长度相等;
在保留的两个升序序列中,重复过程1)、2)、3),直到两个序列中只含一个元素时为止(即是结束条件),较小者即为所求的中位数。
(每次执行过程A和B的剩余长度相等,并且要每次更新序列A和B的长度)
*/
#include<iostream>
using namespace std;
int n,A[100005],B[100005];
int getMiddle()
{
int AStart=0,AEnd=n-1,BStart=0,BEnd=n-1;
int a=A[(n-1)/2];
int b=B[(n-1)/2];
while(AEnd!=AStart)
{
if(a==b)
{
return a;
}
else if(a<b)
{
if(n%2==1)
{
AStart=(AStart+AEnd)/2;
a=A[(AEnd+AStart)/2];
BEnd=(BStart+BEnd)/2;
b=B[(BEnd+BStart)/2];
n=n/2+1;
}
else
{
AStart=(AStart+AEnd)/2+1;
a=A[(AEnd+AStart)/2];
BEnd=(BStart+BEnd)/2;
b=B[(BEnd+BStart)/2];
n=n/2;
}
}
else//a>b
{
if(n%2==1)
{
AEnd=(AStart+AEnd)/2;
a=A[(AEnd+AStart)/2];
BStart=(BStart+BEnd)/2;
b=B[(BEnd+BStart)/2];
n=n/2+1;
}
else
{
AEnd=(AStart+AEnd)/2;
a=A[(AEnd+AStart)/2];
BStart=(BStart+BEnd)/2+1;
b=B[(BEnd+BStart)/2];
n=n/2;
}
}
}
return a<b?a:b;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>A[i];
}
for(int i=0;i<n;i++)
{
cin>>B[i];
}
cout<<getMiddle()<<endl;
return 0;
}
PAT 2-13. 两个有序序列的中位数(25)的更多相关文章
- 求两个有序数组的中位数(4. Median of Two Sorted Arrays)
先吐槽一下,我好气啊,想了很久硬是没有做出来,题目要求的时间复杂度为O(log(m+n)),我猜到了要用二分法,但是没有想到点子上去.然后上网搜了一下答案,感觉好有罪恶感. 题目原型 正确的思路是:把 ...
- 《LeetCode-0004》 寻找两个有序数组的中位数-Median of Two Sorted Arrays
题目给定两个大小为 m 和 n 的有序数组nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- LeetCode Golang 4. 寻找两个有序数组的中位数
4. 寻找两个有序数组的中位数 很明显我偷了懒, 没有给出正确的算法,因为官方的解法需要时间仔细看一下... func findMedianSortedArrays(nums1 []int, nums ...
- [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 ...
- leetcode刷题四<寻找两个有序数组的中位数>
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- LeetCode练习4 找出这两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- [LeetCode] 4. 寻找两个有序数组的中位数
题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 ...
- leetcode第四题:两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 【LeetCode】4. 寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
随机推荐
- vue-resource(搬运)
一.vue-resource特点vue-resource插件具有以下特点: 1. 体积小vue-resource非常小巧,在压缩以后只有大约12KB,服务端启用gzip压缩后只有4.5KB大小,这远比 ...
- 网络通信机制:Socket、TCP/IP、HTTP
13.1.1 TCP/IP协议 讲的很抽象,没具体看懂什么是TCP协议,什么是IP协议.IP协议保证消息从一个主机传送到另一个主机,消息在传送的过程中被分割成一个个小包,TCP协议会让两台相互连接的计 ...
- 关于C语言内存占用
struct T { char a; int *d; int b; int c:16; double e; }; T *p; 在64位系统以及64位编译器下,以下描述正确的是 A. sizeof(p) ...
- 线程_FIFO队列实现生产者消费者
import threading # 导入线程库 import time from queue import Queue # 队列 class Producer(threading.Thread): ...
- 汇编语言从键盘输入一个字符串(串长不大于80)以十进制输出字符串中非字母字符的个数(不是a to z或 A to Z)
(1)从键盘输入一个字符串(串长不大于80). (2)以十进制输出字符串中非字母字符的个数(不是a to z或 A to Z). (3)输出原字符串且令非字母字符闪烁显示. (4)找出字符串中ASCI ...
- Python常用标准库之datetime、random、hashlib、itertools
库:具有相关功能模块的集合 import sys.builtin_module_names #返回内建模块的名字modules 查看所有可用模块的名字 1.1.1获取当前日期和时间 from date ...
- Python 字典(Dictionary) str()方法
Python 字典(Dictionary) str()方法 描述 Python 字典(Dictionary) str() 函数将值转化为适于人阅读的形式,以可打印的字符串表示.高佣联盟 www.cge ...
- PHP ftp_ssl_connect() 函数
定义和用法 ftp_ssl_connect() 函数打开一个安全的 SSL-FTP 连接. 当连接打开,您就可以在服务器运行 FTP 函数. 语法 ftp_ssl_connect(host,port, ...
- 把项目从码云上clone到IntelliJ IDEA
前期工作:安装并已配置好git,并且IDEA已经配置好git了 操作如下: 1) 在IDEA启动页面选择Get from Version Control 2) 打开码云上想要clon ...
- 基于AspectCore打造属性注入
前言 源自于晓晨在成都.net社区群的一篇文章 <晓晨的ASP.NET Core 奇淫技巧之伪属性注入> 他的思路是 Ioc容器替换 ControllerActivator,因为只能在控制 ...