这题在我复习826数据结构专业课中,最后一章(排序)里面接触过,当时只是有一个大概得思想并未去实现它,如今第一次实现这个算法其中很多的细节我算是理清楚了,其中值得注意的点有: int newIndexM=min(m-1,indexM+k/2-1);这行代码主要是避免数组取到的下标越界造成错误,因此取个min。
classSolution { public: int m=0; int n=0; doublefindMedianSortedArraysK(vector<int>& nums1,vector<int>& nums2,int k){ int indexM=0,indexN=0;//分别表示nums1和2的数组当前的下标 while(1){ if(indexM==m) return nums2[indexN+k-1];//数组nums1已经被耗完了 if(indexN==n) return nums1[indexM+k-1]; if(k==1) returnmin(nums1[indexM],nums2[indexN]);
//找到中位数更新 int newIndexM=min(m-1,indexM+k/2-1);//避免越界 int newIndexN=min(n-1,indexN+k/2-1); int pivotM=nums1[newIndexM]; int pivotN=nums2[newIndexN]; if(pivotM<=pivotN){//小于那部分直接去掉 k-=newIndexM-indexM+1; indexM=newIndexM+1; }else{ k-=newIndexN-indexN+1; indexN=newIndexN+1; } } } doublefindMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){ m=nums1.size(); n=nums2.size(); if((m+n)%2==1){ returnfindMedianSortedArraysK(nums1,nums2,(m+n+1)/2);//默认下取整 }else{ return (findMedianSortedArraysK(nums1,nums2,(m+n)/2)+ findMedianSortedArraysK(nums1,nums2,((m+n)/2)+1))/2; } } };