【LeetCode 4】 Median Of Sorted Array

来源:互联网 发布:游族网络最新消息 编辑:程序博客网 时间:2024/06/11 18:45
/**************************LeetCode 4  Median Of Sorted Array************************//*****************************思想:1.定义两个指针索引  pointer1=0,pointer2=0  分别指向nums1 nums2 的首个元素2.数组长度和为偶数时  中位数取一个数 第(len1+len2)/2个数数组长度为奇数时  中位数取两个数 第count个和第count+1个数的平均值3.比较pointer1 和 pointer2 指向的元素的大小,小的向后移动nums1[pointer1]>nums2[pointer2] 则  pointer2++;nums1[pointer1]<=nums2[pointer2] 则  pointer1++;4.计数器count++,比较count是否等于(len1+len2)/25.在比较过程中 注意判断 pointer1 和pointer2 是否到数组的末尾,处理越界问题 时间复杂度:O((m+n)/2)  m,n分别是数组长度空间复杂度 O(1)各种越界处理 满屏幕都是 if....else.... 其实很简单*************************/double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2){if (nums1.size()<1 && nums2.size()<1){return 0;}int pointer1 = 0;int pointer2 = 0;int median = (nums1.size() + nums2.size() - 1) / 2;int count = 0;int  move = 1;  //指示哪个指针在移动  1 pointer1在移动  2 pointer2在移动  while (pointer1<nums1.size() && pointer2<nums2.size() && count<median){if (nums1[pointer1]>nums2[pointer2]){++pointer2;move = 2;}else{++pointer1;move = 1;}count++;}//分别判断结束的条件if (pointer1<nums1.size() && pointer2<nums2.size()){//说明count==medianif ((nums1.size() + nums2.size()) % 2)//长度和为奇数,取1个数{if (move == 1)  //上一次移动是 1{return nums1[pointer1];}else   //上一次移动是 2{return nums2[pointer2];}}else//长度和为偶数,取两个数{ if (move == 1)  //上一次移动是 1{return (nums1[pointer1] + ((pointer1 + 1) >= nums1.size() || (nums1[pointer1 + 1] > nums2[pointer2]) ? nums2[pointer2] : nums1[pointer1 + 1])) / 2.0;//注意越界处理 }else   //上一次移动是 2{return (nums2[pointer2] + (((pointer2 + 1) >= nums2.size()) || (nums2[pointer2 + 1] > nums1[pointer1]) ? nums1[pointer1] : nums2[pointer2 + 1])) / 2.0;}}}else{if (pointer1<nums1.size()) //说明数组2到末尾{while (count<median){++pointer1;}if ((nums1.size() + nums2.size()) % 2)//长度和为奇数,取1个数{return nums1[pointer1];}else{return (nums1[pointer1] + nums1[pointer1 + 1]) / 2.0;}}else  //说明数组1到末尾{while (count < median){++pointer2;}if ((nums1.size() + nums2.size()) % 2)//长度和为奇数,取1个数{return nums2[pointer2];}else{return (nums2[pointer2] + nums2[pointer2 + 1]) / 2.0;}} }}

0 0