(C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数
给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数
思路
logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有:
- A[midA]>B[midB]时:
- 若midA+midB(实际上是midA+midB-beginA-beginB+2,下同)的元素个数>k,则midB之后的序列肯定不包含在最终的有序k个元素的数列中。不能包括=k的情况,因为=k时,midB也可能包含在最终的有序k个元素数列中。这里的等于号的逻辑错误看了很久才发现。
- 若midA+midB的元素个数<=(注意是小于等于)k,则midA及之前的元素肯定包含在最终的有序k个元素的数列中 ,k=k-(midA-beginA+1),转换为一个更小的求第k个数的问题。
#include <iostream>
#define M 5
#define N 6
using namespace std;
int INDEX1[M] = { 1,2,4,5,6 };
int INDEX2[N] = { 2,3,5,7,9,10 };int FindK(int*A, int*B, int beginA, int endA, int beginB, int endB, int k) {printf("A:%d-->%d B:%d-->%d\n", beginA, endA, beginB, endB);int midA = (beginA + endA) / 2;int midB = (beginB + endB) / 2;//已经确定了其中一个有序序列//剩下的有序序列取第k小的数即可if (beginA > endA ) {cout << "K:" << k << endl;return B[beginB + k - 1];}if (beginB > endB ) {cout << "K:" << k << endl;return A[beginA + k - 1];}//beginA、beginB是已确定的两个范围//len是从mid到begin的元素个数int len = midA - beginA + midB - beginB + 2;if (A[midA] < B[midB]) {if (len <= k){//因为折半后合并的元素个数小于K//midA之前的元素一定包含在最终求得第K小的数的有序数列中//但midB前的元素可能大于a[midA],无法确定return FindK(A, B, midA + 1, endA, beginB, endB, k - (midA - beginA + 1));}else//因为合并的元素个数大于所求K//midA后的元素可能小于midB,但midB后的元素肯定大于midB,不可能包含在最终的有序数列中return FindK(A, B, beginA, endA, beginB, midB - 1, k);}else{if (len <= k)return FindK(A, B, beginA, endA, midB + 1, endB, k - (midB - beginB + 1));elsereturn FindK(A, B, beginA, midA - 1, beginB, endB, k);}}//实际这里的边界情况判断并不需要
int Find(int*A, int*B, int beginA, int endA, int beginB, int endB, int k) {if (B[0] >= A[M - 1]) {//cout << "B[0] >= A[M]";if (k <= M)return A[k - 1];return B[k - M - 1];}if (A[0] >= B[N - 1]) {//cout << "A[0] >= B[N]";if (k <= N)return B[k - 1];return A[k - N - 1];}if (k <= M && B[0] >= A[k - 1])return A[k - 1];if (k <= N && A[0] >= B[k - 1])return B[k - 1];return FindK(A, B, beginA, endA, beginB, endB, k);
}void showArray(int a[], int length)
{for (int i = 0; i < length; i++){cout << a[i] << " ";}cout << "\n";
}int main(void) {cout << "INDEX1:";showArray(INDEX1, M);cout << "INDEX2:";showArray(INDEX2, N);int k;cin >> k;cout << "第" << k << "小的数是:" << Find(INDEX1, INDEX2, 0, M - 1, 0, N - 1, k);system("pause");return 0;
}
(C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数相关推荐
- 2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow
2022-12-14:给定一个正数n, 表示从0位置到n-1位置每个位置放着1件衣服 从0位置到n-1位置不仅有衣服,每个位置还摆着1个机器人 给定两个长度为n的数组,powers和rates pow ...
- 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。
问: /** 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数 ...
- 两数之和, 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 可以假设每种输入只会对应一个答案.但是,数组 ...
- 给定两个整数,例如4和5,实现简单的计算器功能,即求出他们的和,差、积、商、余数。
给定两个整数,例如4和5,实现简单的计算器功能,即求出他们的和,差.积.商.余数. #include<stdio.h> int main() {int IOperator,rOperato ...
- 面试题:找两个有序数组所有数第K小的数
给定两个有序数组arr1和arr2,再给定一个整数k,返回两个数组中所有数中第k小的数.要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M, N}) ) 例如: ...
- html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
2021-06-29:在两个都有序的数组中找整体第K小的数. 福大大 答案2021-06-29: 1.A和B长度不等的时候,需要把A和B的长度变成相等. A是短数组,B是长数组. 第k小的数,k从1开 ...
- 在两个已经排好序的数组里找出第K小的数
前言: 这道题是一道非常常见的面试题,也是一道能够考察一个人的编程能力和算法的一道题.如果要求复杂度为 O(k), 是比较容易做出来的,但是,一般来讲,面试官要求给出更低复杂度的算法.网上有很多不同的 ...
- 两个有序数组合起来求第k小的数+左老师专访ACM大神(笔记)8月5日斗鱼直播实录
1.长度相等的两个有序数组寻找上中位数 注:上中位数1 2 3 4 5 6为3(偶数两个中位数为前面那个) 思路:去掉不可能为上中位数的,剩下的简化组合求上中位数. 1.1 奇数序列 位置 位置 位置 ...
- 《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。
题目:给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 解析:看到我写的下面的代码,像一篇文章一样的长, ...
最新文章
- python相对路径库_如何最简单、通俗地理解Python的搜索路径、相对路径、绝对路径?...
- vue.js $refs和$emit 父子组件交互
- Windows打印机驱动开发笔记(一)
- 训练 yolo 模型
- 领英上面的experience和project的区别
- ubuntu19.10升级
- C#在Linux上的开发指南
- C# ASP.NET MVC 微信和支付宝H5支付开发及Demo
- macOS应用程序打开时出现崩溃的情况,怎样处理?
- 20172324《程序设计与数据结构》第一周学习总结
- 2020 cr节目源_2020最新直播源
- Python eval 函数使用报错 name 'false' is not defined 已解决
- 几种常见的距离计算公式
- SOLARIS SYSTEM COMMAND(个人整理笔记)
- 27岁学前端开发,3年前端开发工资待遇
- 图中PNP型三极管发射极和基极为什么要加个100K(R21)的电阻?
- 斐波那契数列c语言while,C语言数据结构递归之斐波那契数列
- 解决Aid Learning无法联网问题
- toolbar遇到问题和解决方式
- [组原]初识-地址总线,地址寄存器,存储单元,存储字长