题目不难,关键是边界条件要想清楚。先写一个时间复杂度为O(K) 的解法。

#include

using namespace std;

//a[] increase

//b[] decrease

//use ret_value to return the result

//function ret reprsent the error if not 0

int find_k(int a[], int b[], int m, int n, int k, int& ret_value) {

if(k<=0 || m<0 || n<0 || k>(m+n)) {

return -1;

}

int i = 0, x = m-1, y = 0;

while (i=0 && y<=n-1) {

if (a[x] > b[y]) {

ret_value = a[x];

i++;

x--;

} else if (a[x]

ret_value = b[y];

i++;

y++;

} else { //equal

ret_value = a[x];

i+=2;

x--;

y++;

}

}

cout <

<

<

<

i = k-i;

if (i > 0) {

if (x<0) {

ret_value = a[y+i-1];

} else if (y > n-1) {

ret_value = a[x-i+1];

}

}

return 0;

}

int main () {

int a[] = {1,2,3};

int b[] = {6,5,3};

int k=0;

cout <

cin >> k;

int value = -1;

find_k(a,b,3,3,k,value);

cout <

return 0;

}

再附上一个时间复杂服为O(log n)的算法实现,

算法思想是:

每次从两个数组里数 k/2 个数,比较其大小,较大的那个数所在的数组里这 k/2 个数, 肯定在前k大个数里面;

这样就排除了k/2个数,然后再在剩下的数里面找第k/2大的数,循环到找到最后一个数为止。

为了简化一下,假设两个数组都为降序。

注意程序的31~34行,如果不判断相等,当最后还剩一个数的时候,第20行mid_b = pb + kb -1;mid_b 会被赋值为一个错误的位置,导致程序陷入死循环//both a[] b[] decrease

int find_k_both_increase_O_log_k(int a[], int b[], int m, int n, int k, int& ret_value) {

if(k<=0 || m<0 || n<0 || k>(m+n)) {

return -1;

}

int ka = 0;

int kb = 0;

int pa = 0;

int pb = 0;

int mid_a = 0;

int mid_b = 0;

int i = k;

while (i>0 && pa

ka = i/2;

kb = i-ka;

mid_a = pa + ka -1;

mid_b = pb + kb -1;

if (mid_a

if (a[mid_a] > b[mid_b]) {

ret_value = a[mid_a];

pa = mid_a + 1;

i = i - ka;

} else if (a[mid_a]

ret_value = b[mid_b];

pb = mid_b + 1;

i = i - kb;

} else { //equal

ret_value = a[mid_a];

return 0;

}

}

cout <

<

<

cout <

}

if (i > 0) {

if (pa > m-1) {

ret_value = a[pb-1+i];

} else if (pb > n-1) {

ret_value = a[pa-1+i];

}

}

return 0;

}

在leetcode上碰到该题的改进版本,被标识为hard,看起来简单的题目,其实不简单。

附上题目和代码如下:

Median of Two Sorted Arrays

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

找第k大个数,和我上面一个稍微有点不同,写起来很多边界条件,回头多看几遍。int find(int A[], int m, int B[], int n, int k) {

if (m==0) {

return B[k-1];

}

if (n==0) {

return A[k-1];

}

int pa=0, pb=0;

int sa=0, sb=0;

int ka=0, kb=0;

while (k>1 && sa

ka = k/2;

kb = k-ka;

pa = sa + ka -1;

pb = sb + kb -1;

if (pa >= m) {

pa = m-1;

ka = m-sa;

kb = k-ka;

pb = sb + kb -1;

} else if (pb >= n) {

pb = n-1;

kb = n-sb;

ka = k - kb;

pa = sa + ka -1;

}

if (A[pa] > B[pb]) {

k = ka;

sb = pb+1;

} else if (A[pa]

k = kb;

sa = pa+1;

} else { //A[pa] == B[pb]

return A[pa];

}

}

if (sa>=m) {

return B[sb+k-1];

} else if (sb >= n) {

return A[sa+k-1];

}

if (k == 1) {

return A[sa]

}

}

class Solution {

public:

double findMedianSortedArrays(int A[], int m, int B[], int n) {

int k=(m+n+1)/2;

if ((m+n)&1) {

return find(A, m, B, n, k);

} else {

return (double)(find(A, m, B, n, k) + find(A, m, B, n, k+1))/2;

}

}

};

c语言判断数组里的数据先递增后递减,查找两个有序序数组(一个递增、一个递减)中第K大的数...相关推荐

  1. Leetcode215数组中第k大的数-最小堆

    题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ...

  2. 寻找数组中第k大的数

    题目:有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2 ...

  3. java查找第k大的数字_查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  4. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  5. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

  6. python实现查找数组中第k大的数

    本文用python3实现查找数组中第k大的数.采用快速排序的方法实现. def findKth(s, k):return findKth_c(s, 0, len(s) - 1, k)def findK ...

  7. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  8. java查找第k大的数字_[经典算法题]寻找数组中第K大的数的方法总结

    今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以 ...

  9. python查找第k大的数_寻找数组中第K大的数

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...

最新文章

  1. 解决wubi安装ubuntu时要下载系统映像文件问题
  2. Java多线程的几种实现方法
  3. PKI/CA (5)X.509公钥证书
  4. python自动化办公培训_python-自动化办公
  5. PHP的composer清除缓存
  6. CCKS2018参会总结项目
  7. 基于Opencv和Tesseract的行驶证识别系统设计
  8. 营业收费系统 建立报表库服务器,浅谈计算机在自来水收费系统的重要应用
  9. DirectShow 简介
  10. 因文件包含病毒或潜在的垃圾软件导致被防火墙拦截的解决方法
  11. WEB财务报表设计器的实现
  12. ODOO13 开发教程四 模型中的字段
  13. 神经网络训练常见坑-新手如何优化调整训练神经网络
  14. vps搭建代理ip服务
  15. Android直播开发之旅(25):使用AES算法加密多媒体文件(+RSA+MD5+Base64)
  16. 南邮-2043(有才华的罗老师)
  17. 阻尼振动与无阻尼电磁振动(大学物理笔记)
  18. Angular中优雅的处理RxJs自动取消订阅的方式以免出现内存泄露以及多次调用的问题
  19. 中超风云2服务器维护,时隔三年“中超”IP强势回归《中超风云2》手游现已开启预约...
  20. 近红外光谱预处理方法汇总

热门文章

  1. Learn OpenGL (三):着色器
  2. 设置VSCode运行任务命令快捷键Alt+R,通常用于npm start(对频繁使用该命令可节省50%的输入命令行打字时间)
  3. 计算TD-LTE DL 峰值速率的工具和相关参数
  4. PHP的一种缓存方案静态化
  5. Linux常用命令--网终设置
  6. 【BZOJ1015】【JSOI2008】星球大战 并查集
  7. 《对软件工程课程的期望》
  8. Hadoop 全分布模式 平台搭建
  9. [SQL基础教程] 1-5 表的删除和更新
  10. JZOJ #4722 跳楼机 (最短路模型的完美转化)