制作网站单页,专门做办公的网站,服务器上的网站打不开,wordpress 用户组1.实验内容
给定两个大小分别为 m 和 n 的正序#xff08;从小到大#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
2.实验目的
算法的时间复杂度应该为 O(log (mn)) 。
3.基本思路
碰到时间复杂度要求log的#xff0c;肯定用二分查找…1.实验内容
给定两个大小分别为 m 和 n 的正序从小到大数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
2.实验目的
算法的时间复杂度应该为 O(log (mn)) 。
3.基本思路
碰到时间复杂度要求log的肯定用二分查找即每次在现有数据的一半中找下一次再一半每次循环可以将查找范围缩小一半。但是我这里用多的是双指针算法一起查找不需要归并数组只需找到中位数的下标但是复杂度仍然是Ominmn
4.算法分析
首先需要通过判断m和n的大小来确定两个数组是否为空。
如果两个数组都不为空则使用双指针法遍历两个数组将较小的元素依次添加到动态数组temp中直到找到第k1小的元素为止。
如果其中一个数组为空则直接将另一个非空数组赋值给temp。最后根据(mn)%2的值来判断中位数的位置。如果为奇数则直接取temp[k]作为结果如果为偶数则取temp[k]和temp[k-1]的平均值作为结果。
5.实验心得
碰到时间复杂度要求log的肯定用二分查找但是双指针算法比普通的归并算法还是要好一些。
代码
class Solution {
public:double findMedianSortedArrays(vectorint nums1, vectorint nums2) {float result;int mnums1.size();int nnums2.size();int k(mn)/2;vector int temp;int i0,j0;int count0;//如两个数组不为空找到前k1小数存入新数组if(m0 n0){while(countk){if(im){temp.push_back(nums2[j]);count;continue;}if(jn){temp.push_back(nums1[i]);count;continue;}temp.push_back(nums1[i]nums2[j]?nums1[(i)]:nums2[(j)]);count;}}//其中一个数组为空的情况下else if(m0) tempnums2;else if(n0) tempnums1;//返回中位数if((mn)%2!0){resulttemp[k];}else {result(float(temp[k])float(temp[k-1]))/2;}return result;}
};
PS不是我写的