/***************************************************************************
**description:两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回
**            要求总的时间复杂度为O(log(m+n))
***************************************************************************/#include<iostream>
#include<vector>
using namespace std;//方法一:按照merge的思想找第k个数据,但merge过程中把重复元素也算在内
//时间复杂度O(m+n),空间复杂度O(1)
int findKthOfTwoSortedArrays_1(const vector<int> &arr1, const vector<int> &arr2, int k)
{int index = 0;int i = 0;int j = 0;while (i < arr1.size() || j < arr2.size()){if (arr1[i] <= arr2[j] || j == arr2.size()){index++;if (k == index)return arr1[i];i++;}else if (arr1[i] > arr2[j] || i == arr1.size()){index++;if (k == index)return arr2[j];j++;}}}//方法二:按照merge的思想找第k个数据,但对重复元素只计一次数
//时间复杂度O(m+n),空间复杂度O(1)
int findKthOfTwoSortedArrays_2(const vector<int> &arr1, const vector<int> &arr2, int k)
{int index= 0;int i = 0;int j = 0;while (i < arr1.size() || j < arr2.size()){if (i == arr1.size()){if (arr2[j] == arr2[j - 1])j++;else{index++;if (k == index)return arr2[j];j++;}}else if (j == arr2.size()){if (arr1[i] == arr1[i - 1])i++;else{index++;if (k == index)return arr1[i];i++;}}else{if (arr1[i] < arr2[j]){index++;if (k == index)return arr1[i];i++;}else if (arr1[i] > arr2[j]){index ++;if (k == index)return arr2[j];j++;}elsei++;}}return 0;
}//方法三:假设A和B的元素个数都大于k/2,比较A的第k/2个元素A[k/2-1]和B的第k/2个元素B[k/2-1],有以下三种情况:
//       A[k/2-1] == B[k/2-1]  A[k/2-1]和B[k/2-1]即为第K元素
//       A[k/2-1] > B[k/2-1]   B[k/2-1]不可能大于A并B的第k个元素,删除这k/2个元素
//       A[k/2-1] < B[k/2-1]   A[k/2-1]不可能大于A并B的第k个元素,删除这k/2个元素
//时间复杂度 O(log(m+n)),空间复杂度O(log(m+n))
//但这种方法没有处理两个数组中相同元素的问题
int findKth(vector<int>::const_iterator A, int m, vector<int>::const_iterator B, int n, int k)
{if (m > n)return findKth(B, n, A, m, k);if (m == 0)return *(B + k - 1);if (k == 1)return min(*A, *B);int posA = min(m, k / 2);int posB = k - posA;if (*(A + posA - 1) < *(B + posB - 1))findKth(A + posA, m - posA, B, n, k - posA);else if (*(A + posA - 1) > *(B + posB - 1))findKth(A, m, B + posB, n - posB, k - posB);elsereturn *(A + posA - 1);
}
int findKthOfTwoSortedArrays_3(const vector<int> &arr1, const vector<int> &arr2, int k)
{return findKth(arr1.begin(),arr1.size(), arr2.begin(), arr2.size(), k);
}

两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回相关推荐

  1. c语言字符数组的实际长度,C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别...

    1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c ...

  2. 寻找两个有序数组的中位数(虚拟数组图文详解)

    思路一(暴力):   当看到这个题目的时候可能会觉的是不是系统高估了这个题目,这个这么简单,只需要将两个数组合并,排序然后合并就好了.这样做确实可以求出中位数,但是并不能说是完成题目的要求,因为题目的 ...

  3. 算法练习day9——190327(“之” 字形打印矩阵、在行列都排好序的矩阵中找数、打印两个有序链表的公共部分、判断一个链表是否为回文结构)

    1."之" 字形打印矩阵 [题目] 给定一个矩阵matrix, 按照"之" 字形的方式打印这个矩阵, 例如: 1 2 3 4 5 6 7 8 9 10 11 1 ...

  4. 链表问题1——打印两个有序链表的公共部分

    题目 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分. 思路 因为是有序链表假设从小到大,所以从两个链表的头开始进行如下判断: 如果head1的值小于head2,则head1往 ...

  5. 算法-打印两个有序链表的公共部分

    题目要求:给定两个有序链表的头指针node1和node2,打印两个链表的公共部分. 思路:比较简单,用两个指针从头节点开始遍历,比较两个节点的值,有三种情况 1.如果node1的指针指向的值大于nod ...

  6. Coding Interview Guide--打印两个有序链表的公共部分

    [题目] 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分. [分析] 链表可能为空也可能非空,而对于空链表程序不需要进行任何操作:若是非空链表,因为链表有序,所以要么是递增,要 ...

  7. PTA : 函数题 7-3 两个有序链表序列的交集 (20 分)

    大一下本期数据结构 数据结构题目集 两个有序链表序列的交集 (20 分) 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3. 输入格式: 输入分两行,分别在每行给出由若干个正 ...

  8. 二分法:两个有序数组长度为N,找到第N、N+1大的数

    题目 两个有序数组长度为N,找到第N.N+1大的数 思路1:双指针,O(N)复杂度 简述思路: 如果当前A指针指向的数组A的内容小于B指针指向的数组B的内容,那么A指针往右移动,然后nums(当前已经 ...

  9. LeetCode实战:寻找两个有序数组的中位数

    题目英文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

最新文章

  1. java 将本地图片批量上传到oss服务
  2. iphone:关于沙盒 存储路径
  3. Linux服务器集群系统(二)--转
  4. 【CyberSecurityLearning 附】虚拟机部署Linux操作系统(centos6.9、Ubuntu16.04)
  5. 兴义高考八中2021成绩查询,兴义第八中学2021年录取分数线
  6. 产品经理十二时辰:内容过于真实,扎心了!
  7. [Jobdu] 题目1530:最长不重复子串
  8. poi 不自动计算 设置单元格公式_Java POI:如何读取Excel单元格的值而不是计算公式?...
  9. Word2Vec学习笔记(三)
  10. 3-5:HTTP协议之Cookie和Session
  11. UTF-8的CSV文件中文乱码问题解决办法
  12. PLC状态机编程第六篇-优化PLC程序生成
  13. 短视频图像处理 OpenGL ES 实践
  14. 最小标示法模板 poj1509
  15. mysql端口establish_sqlserver提示The Network Adapter could not establish the con
  16. jmeter生成接口测试报告
  17. 如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)
  18. Phonetic symbol 辅音 - 清辅音 -- /f/
  19. 物流与供应链管理前言
  20. word图文混排复制到FCKEditor图片不显示

热门文章

  1. Flutter 导包错误 Target of URI doesn't exist
  2. css中white-space 属性:“pre”, “pre-line”, “pre-wrap” “nowrap”的区别
  3. 树莓派3B+实现TM1637驱动数码管
  4. 农村将迎来重大爆发!传统农业链条正在重塑,关键一步已经迈出
  5. 优质的计算机专业书籍有哪些?
  6. python-opencv创建空白图
  7. 十个Chatbot框架介绍
  8. 为Gridea主题添加思源宋体字体支持
  9. 32位MIPS流水线CPU设计
  10. 为什么要给网桥分配IP地址