两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
#include <iostream> using namespace std; /*函数作用:取待排序序列中low、mid、high三个位置上数据,选取他们中间的那个数据作为枢轴*/ int median(int arr[], int b[], int len1, int low, int high) { int mid = low + ((high - low) >> 1); //计算数组中间的元素的下标 int &lowData = low >= len1 ? b[low - len1] : arr[low]; int &midData = mid >= len1 ? b[mid - len1] : arr[mid]; int &highData = high >= len1 ? b[high - len1] : arr[high]; //使用三数取中法选择枢轴 if (midData > highData) //目标: arr[mid] <= arr[high] { swap(midData, highData); } if (lowData > highData) //目标: arr[low] <= arr[high] { swap(lowData, highData); } if (midData > lowData) //目标: arr[low] >= arr[mid] { swap(midData, lowData); } //此时,arr[mid] <= arr[low] <= arr[high] return lowData; //low的位置上保存这三个位置中间的值 //分割时可以直接使用low位置的元素作为枢轴,而不用改变分割函数了 } int kth_elem(int a[], int b[], int len1, int low, int high, int k) { int pivot = median(a, b, len1, low, high); //要么是选取数组中中位数作为枢纽元,保证最坏情况下,依然为线性O(N)的平均时间复杂度。 int low_temp = low; int high_temp = high; while (low < high) { int tmp = high >= len1 ? b[high - len1] : a[high]; while (low < high && tmp >= pivot) { --high; tmp = high >= len1 ? b[high - len1] : a[high]; } if (low >= len1) { b[low - len1] = tmp; } else { a[low] = tmp; } int tmp1 = low >= len1 ? b[low - len1] : a[low]; while (low < high && tmp1 < pivot) { ++low; tmp1 = low >= len1 ? b[low - len1] : a[low]; } if (high >= len1) { b[high - len1] = tmp1; } else { a[high] = tmp1; } } if (low >= len1) { b[low - len1] = pivot; } else { a[low] = pivot; } //以下就是主要思想中所述的内容 if (low == k - 1) { if (low >= len1) { return b[low - len1]; } return a[low]; } else if (low > k - 1) return kth_elem(a, b, len1, low_temp, low - 1, k); else return kth_elem(a, b, len1, low + 1, high_temp, k); } void printArray(int* arr, int len) { if (!arr) { return; } for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } cout << endl; } void print2SortedArray(int* a, int* b, int len1, int len2) { int* arr = new int[len1 + len2]; for (int i = 0; i < len1; ++i) { arr[i] = a[i]; } for (int i = len1, j = 0; j < len2; ++i, j++) { arr[i] = b[j]; } sort(arr, arr + len1 + len2); printArray(arr, len1 + len2); delete arr; } int main() { int arr1[] = { 2, 12, 5, 10, 43, 24, 33, 4 }; int arr2[] = { 10, 23, 41, 70, 84, 29, 6 }; int len1 = sizeof(arr1) / sizeof(int); int len2 = sizeof(arr2) / sizeof(int); print2SortedArray(arr1, arr2, len1, len2); int mid1 = (len1 + len2) / 2 + 1; int mid2 = (len1 + len2) % 2 == 0 ? mid1 - 1 : mid1; int midData1 = kth_elem(arr1, arr2, len1, 0, len1 + len2 - 1, mid1); int midData2 = kth_elem(arr1, arr2, len1, 0, len1 + len2 - 1, mid2); // cout << midData1 << ',' << midData2 << endl; cout << "中位数: " << (midData1 + midData2) / 2 << endl; return 0; }
两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。的更多相关文章
- 已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j]
方法一:枚举法.该方法是最容易.也是最简单的方法,枚举出数组A和数组B中所有的元素对,判断其和是否为c,如果是,则输出. 方法二:排序+二分查找法.首先,对两个数组中长度较大数组,不妨设为A,排序:然 ...
- 从0打卡leetcode之day 5 ---两个排序数组的中位数
前言 我靠,才坚持了四天,就差点不想坚持了.不行啊,我得把leetcode上的题给刷完,不然怕是不好进入bat的大门. 题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . ...
- 如何寻找无序数组中的第K大元素?
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...
- 对无序数组的并发搜索的java实现
对无序数组的并发搜索的实现可以充分的用到多cpu的优势 一种简单的策略是将原始数组按照期望的线程数进行分割,如果我们计划使用两个线程进行搜索,就可以把一个数组分成两个,每个线程各自独立的搜索,当其中有 ...
- 从长度为 M 的无序数组中,找出N个最小的数
从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK ...
- 无序数组求第K大的数
问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...
- [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 ...
- 取两个String数组的交集
import org.testng.annotations.Test; import java.util.HashMap; import java.util.LinkedList; import ja ...
- 有1,2,3一直到n的无序数组,排序
题目:有1,2,3,..n 的无序整数数组,求排序算法.要求时间复杂度 O(n), 空间复杂度O(1). 分析:对于一般数组的排序显然 O(n) 是无法完成的. 既然题目这样要求,肯定原先的数组有一定 ...
随机推荐
- HTML5中meta属性大集合
1.声明文档的字符编码 <meta charset='utf-8'> 2.声明文档的兼容模式 <meta http-equiv="X-UA-Compatible" ...
- Python系列之 - 面向对象(2)
类的三大特性 类的三大特性包括: 封装.继承.多态 一 封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...
- ios开发-程序压后台后,悄悄的抓取数据~~
我们使用某个app的时候,当我们将程序压到后台之后,我们希望它还能从服务器抓取一些数据,类似微博,微信,qq这些程序压后台 之后,我们依然能看到icon上显示未读数量.但是ios系统是伪多任务操作系统 ...
- [HEOI 2014]大工程
Description 题库链接 给你一个 \(n\) 个节点的树, \(q\) 组询问,每次给出 \(k\) 个关键点,询问这 \(k\) 个关键点两两间路径长度和,长度最值. \(1\leq n\ ...
- luogu 3413 SAC#1 - 萌数
题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...
- [HAOI2011]Problem c
题目描述 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来 了以后尝试坐到ai,如果ai被占据了,就尝试ai+ ...
- [SCOI2010]幸运数字
题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运 ...
- bzoj 5000: OI树
Description 几天之后小跳蚤即将结束自己在lydsy星球上的旅行.这时,lydsy人却发现他们的超空间传送装置的能量早在小跳 蚤通过石板来到lydsy星球时就已经消耗光了.这时,小跳蚤了解到 ...
- 【QAQ的Minecraft】
树套树被QAQ用木斧挖了,只剩二维RMQ了. 题目: QAQ最近爱上了一款很平凡的游戏,叫做<Minecraft>.目前游戏更新到了1.12版本,他发现了一条新的指令:/fill ...
- java(MyEclipse)创建webservice和测试webservice
转载地址:http://blog.csdn.net/hsfy2012/article/details/46300921 创建并发布自己的Webservice的工具 1 安装MyEclipse 2 ...