题目:
解法一:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
int len=m+n;
int index1=0,index2=0;
int pre=-1,now=-1;
for(int i=0;i<=len/2;i++){
pre=now;
if(index1<m && (index2>=n || nums1[index1]<nums2[index2]) ){
now=nums1[index1++];
}
else{
now=nums2[index2++];
}
}
if(len%2==1){
return now;
}
else{
return (pre+now)/2.0;
}
}
};
解法二(二分法):
class Solution {
public:
int find_mink(vector<int> nums1,vector<int> nums2,int k,int startA,int startB){
int m=nums1.size();
int n=nums2.size();
// cout<<"end"<<endl;
if(k==1){
// cout<<"9"<<endl;
// cout<<startA<<":"<<startB<<endl;
// cout<<"hehe:"<<m<<endl;
if(startA>=m)
{
// cout<<11<<endl;
// cout<<"s:"<<nums2[startB]<<endl<<11<<endl;
return nums2[startB];
}
else if(startB>=n){
// cout<<17<<endl;
// cout<<"s:"<<nums1[startA]<<endl<<15<<endl;
return nums1[startA];
}
else if(nums1[startA]>nums2[startB]){
return nums2[startB];
}
else{
return nums1[startA];
}
}
else if(startA>=m){
// cout<<23<<endl;
// cout<<startB<<endl;
// cout<<k-1<<endl;
// cout<<"s:"<<nums2[startB+k-1]<<endl<<19<<endl;
return nums2[startB+k-1];
}
else if(startB>=n){
// cout<<28<<endl;
// cout<<"s:"<<nums1[startA+k-1]<<endl<<24<<endl;
return nums1[startA+k-1];
}
else
{
// cout<<28<<endl;
int half_k=k/2;
int index1=min(half_k+startA-1,m-1);
int index2=min(half_k+startB-1,n-1);
if(nums1[index1]<nums2[index2]){
// cout<<33<<endl;
k=k-(index1-startA+1);
return find_mink(nums1,nums2,k,index1+1,startB);
}
else{
// cout<<38<<endl;
k=k-(index2-startB+1);
return find_mink(nums1,nums2,k,startA,index2+1);
}
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
int left=(m+n+1)/2;
int right=(m+n+2)/2;
// cout<<"start"<<endl;
int number1=find_mink(nums1,nums2,left,0,0);
// cout<<"last1:"<<number1<<endl;
int number2=find_mink(nums1,nums2,right,0,0);
// cout<<"last2:"<<number2<<endl;
// cout<<"last:"<<number1<<":"<<number2<<endl;
return (number1+number2)/2.0;
}
};
教训:写逻辑比较复杂的代码一定要慢慢写,数组边界条件考虑清楚,变量的定义不要忘记。考虑清楚了才不会写代码十分钟,debug两小时,真是美滋滋。