两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回
来源:互联网 发布:ppt书籍推荐 知乎 编辑:程序博客网 时间:2024/05/16 17:43
/*****************************************************************************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++; } else i++; } } 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); else return *(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);}
阅读全文
1 0
- 两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回
- Java--给定两个有序的数组,长度分别为m和n,求这两个数组中的第K个元素。
- 两个有序数组,A[k]和B[k]长度都为k。求前k个最小的(a[i]+b[j])
- 给出两个长度为N的有序数组A和B 给出求中位数的算法
- 快速找到两个有序数组第(m+n)/2个元素
- 复杂度为log(m+n)下求有序数组A和B有序合并之后第k小的数
- 给定两个长度相同,分别有序的数组A和B,求两个数组中所有数的中位数
- 两个无序数组分别叫A和B,长度分别是m和n,求中位数,要求时间复杂度O(m+n),空间复杂度O(1) 。
- 求两个有序数组A和B的第k大的数——Java
- Java实现O(log(n+m))两个有序数组中第K大元素或中位数
- 两个有序数组的第n大数
- 两个有序数组合并,并求中位数(复杂度为O(m+n))
- 两个有序数组元素之和的最小K个值
- 在两个有序数组中找到第k小的数
- 在两个有序数组中寻找第k个元素
- 两个有序数组合并找第k个元素
- 两个有序数组中的第K个元素
- 两个有序数组,求有序合并以后的第K个元素
- 集合操作
- LeetCode 107. Binary Tree Level Order Traversal II 树的BFS、DFS
- linux 下 jdk 安装教程
- C语言总结
- Java多线程-工具篇-BlockingQueue
- 两个有序数组A、B,长度分别为m、n,找到两个数组的第k个值并返回
- Picasso
- [leetcode]Reverse Linked List II
- 正则表达式学习笔记
- java 数据类型总结
- python练习一
- [LeetCode 解题报告]009.Palindrome Number
- Jquery-选择器
- learnopencv.com介绍