[leetcode]Median of Two Sorted Arrays
2016-10-18 19:11
405 查看
Problem Link
代码很简单,不写啦
这个做法也好理解,附代码
思想如下:
对于有序序列a, b, 假设a, b的长度均=K/2。比较a[k/2-1], b[k/2-1]
如果a[k/2-1] < b[k/2-1] 意味着什么?
意味着 a序列的前k/2个都不可能是第k小的元素。
这时a序列需要被考虑的部分只有后半段,并且变成寻找第k/2小的元素。
递归实现这个过程,考虑好边界情况即可。 附代码:
Description
求给定两个有序数组的中位数。如:{1,2,3} 和 {4,5,6}的中位数是3.5。Possible solution
N = n + m时间复杂度 :O(N logN)
先合并,后排序,然后考虑单复数,取中位数。代码很简单,不写啦
时间复杂度:O(N)
用两个指针PA,PB扫描序列,直到扫描过(N+1)/2个后停止,N为偶数情况下接着扫描第N/2+1个。这个做法也好理解,附代码
class Solution { public: double findMedianSortedArrays(vector& nums1, vector& nums2) { int m = nums1.size(), n = nums2.size(); int k = (m + n + 1) / 2; int counter = 0; vector::iterator iter1 = nums1.begin(); vector::iterator iter2 = nums2.begin(); int ans = 0, ans2 = 0; while (counter < k) { if (iter2 == nums2.end() || (iter1 != nums1.end() && *iter1 < *iter2)) { ans = *iter1; ++iter1; }else { ans = *iter2; ++iter2; } ++counter; } double Ans; if ((m + n) % 2 == 0) { //int ans2 = 0; if (iter2 == nums2.end() ||(iter1 != nums1.end() && *iter1 < *iter2)) ans2 = *iter1; else ans2 = *iter2; Ans = (ans + ans2) * 0.5; }else Ans = ans; return Ans ; } };
时间复杂度 O(log N)
这个做法不仅可以用于找中位数,也可以用于找第k小的数。思想如下:
对于有序序列a, b, 假设a, b的长度均=K/2。比较a[k/2-1], b[k/2-1]
如果a[k/2-1] < b[k/2-1] 意味着什么?
意味着 a序列的前k/2个都不可能是第k小的元素。
这时a序列需要被考虑的部分只有后半段,并且变成寻找第k/2小的元素。
递归实现这个过程,考虑好边界情况即可。 附代码:
#include<vector> #include<iostream> using namespace std; class Solution { public: static int findkth(vector<int>& a, int la, int ra, vector<int>& b, int lb, int rb, int k) { if (ra - la > rb - lb) return findkth(b,lb,rb, a, la, ra, k); if (ra <= la) return b[k-1]; if (k == 1) return min(a[la], b[lb]); int pos_delta = min(k/2, ra-la); int pos_a = la + pos_delta - 1, pos_b = lb + (k-pos_delta) -1; if (a[pos_a] == b[pos_b]) return a[pos_a]; if (a[pos_a] < b[pos_b]) return findkth(a, pos_a + 1, ra, b, lb, rb, k - pos_delta); else return findkth(a, la, ra, b, pos_b+1, rb, pos_delta); } double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n = nums1.size(),m = nums2.size(); int total = n + m; if (total & 1 == 1) return findkth(nums1, 0, n, nums2, 0, m, total/2+1); else return (findkth(nums1,0, n, nums2, 0, m, total/2+1) + findkth(nums1, 0, n, nums2, 0, m, total/2)) * 0.5; } };
相关文章推荐
- leetcode Median of Two Sorted Arrays
- [leetcode]Median of Two Sorted Arrays
- leetcode 26: Median of Two Sorted Arrays
- LeetCode: Median of Two Sorted Arrays
- LeetCode题目笔记(三) -- Median of Two Sorted Arrays
- LeetCode 4 - Median of Two Sorted Arrays
- [leetcode] Median of Two Sorted Arrays
- [LeetCode] Median of Two Sorted Arrays 解题报告
- LeetCode: Median of Two Sorted Arrays
- LeetCode刷题笔录 Median Of Two Sorted Arrays
- LeetCode Online Judge 题目C# 练习 - Median of Two Sorted Arrays
- leetCode_Median of Two Sorted Arrays
- LeetCode: Median of Two Sorted Arrays
- leetcode 26: Median of Two Sorted Arrays
- LeetCode Median of Two Sorted Arrays
- LeetCode-Median of Two Sorted Arrays
- Median of Two Sorted Arrays-----LeetCode
- [LeetCode题解004]Median of Two Sorted Arrays
- LeetCode —— Median of Two Sorted Arrays
- leetcode-004:Median of Two Sorted Arrays