给定两个长度为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小的数相关推荐

  1. 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 ...

  2. 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

    问: /** 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数 ...

  3. 两数之和, 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

    两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那两个整数,并返回它们的数组下标. 可以假设每种输入只会对应一个答案.但是,数组 ...

  4. 给定两个整数,例如4和5,实现简单的计算器功能,即求出他们的和,差、积、商、余数。

    给定两个整数,例如4和5,实现简单的计算器功能,即求出他们的和,差.积.商.余数. #include<stdio.h> int main() {int IOperator,rOperato ...

  5. 面试题:找两个有序数组所有数第K小的数

    给定两个有序数组arr1和arr2,再给定一个整数k,返回两个数组中所有数中第k小的数.要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M, N}) ) 例如: ...

  6. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。

    2021-06-29:在两个都有序的数组中找整体第K小的数. 福大大 答案2021-06-29: 1.A和B长度不等的时候,需要把A和B的长度变成相等. A是短数组,B是长数组. 第k小的数,k从1开 ...

  7. 在两个已经排好序的数组里找出第K小的数

    前言: 这道题是一道非常常见的面试题,也是一道能够考察一个人的编程能力和算法的一道题.如果要求复杂度为 O(k), 是比较容易做出来的,但是,一般来讲,面试官要求给出更低复杂度的算法.网上有很多不同的 ...

  8. 两个有序数组合起来求第k小的数+左老师专访ACM大神(笔记)8月5日斗鱼直播实录

    1.长度相等的两个有序数组寻找上中位数 注:上中位数1 2 3 4 5 6为3(偶数两个中位数为前面那个) 思路:去掉不可能为上中位数的,剩下的简化组合求上中位数. 1.1 奇数序列 位置 位置 位置 ...

  9. 《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。

    题目:给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 解析:看到我写的下面的代码,像一篇文章一样的长, ...

最新文章

  1. python相对路径库_如何最简单、通俗地理解Python的搜索路径、相对路径、绝对路径?...
  2. vue.js $refs和$emit 父子组件交互
  3. Windows打印机驱动开发笔记(一)
  4. 训练 yolo 模型
  5. 领英上面的experience和project的区别
  6. ubuntu19.10升级
  7. C#在Linux上的开发指南
  8. C# ASP.NET MVC 微信和支付宝H5支付开发及Demo
  9. macOS应用程序打开时出现崩溃的情况,怎样处理?
  10. 20172324《程序设计与数据结构》第一周学习总结
  11. 2020 cr节目源_2020最新直播源
  12. Python eval 函数使用报错 name 'false' is not defined 已解决
  13. 几种常见的距离计算公式
  14. SOLARIS SYSTEM COMMAND(个人整理笔记)
  15. 27岁学前端开发,3年前端开发工资待遇
  16. 图中PNP型三极管发射极和基极为什么要加个100K(R21)的电阻?
  17. 斐波那契数列c语言while,C语言数据结构递归之斐波那契数列
  18. 解决Aid Learning无法联网问题
  19. toolbar遇到问题和解决方式
  20. [组原]初识-地址总线,地址寄存器,存储单元,存储字长

热门文章

  1. metasploit 魔鬼训练营 学习笔记(2) 第四章(web一些漏洞与防止)
  2. Processing运行时Sketchbook找不到的问题
  3. Ubuntu宽带拨号连接设置
  4. 【python可迭代对象】
  5. Build-Tools 下载不下来,自己可以手动去网页下载哦
  6. 百度SEO推广怎么做?软文发稿推广的优势是什么?
  7. java毕业生跟踪调查反馈系统springboot+vue
  8. 计算若干整数的和,这些整数都是小于1000的非负整数。
  9. 【学习强化学习】十三、模仿学习介绍
  10. Mysql更改列名的方法