4. 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
题解:采用了遍历的手法,刚好符合log(m + n)的时间复杂度,要注意两个数组总数和为奇数或者偶数的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include "../include/leetcode.h" class Solution { public : double findMedianSortedArrays(vector< int >& nums1, vector< int >& nums2) { int left = (nums1.size() + nums2.size()) % 2; int medianPositioin = (nums1.size() + nums2.size()) / 2; //两个数组数量加起来是偶数的情况 if (left == 0) { medianPositioin -= 1; } int index = 0; int i1, i2; double currentNum; for (i1 = i2 = 0; i1 < nums1.size() && i2 < nums2.size() && index <= medianPositioin;) { currentNum = nums1[i1] < nums2[i2] ? nums1[i1] : nums2[i2]; if (currentNum == nums1[i1]) { ++i1; } else { ++i2; } index += 1; } for (; i1 < nums1.size() && index <= medianPositioin; ++i1) { currentNum = nums1[i1]; index += 1; } for (; i2 < nums2.size() && index <= medianPositioin; ++i2) { currentNum = nums2[i2]; index += 1; } if (left == 1) { return currentNum; } else { double currentNextNum; if (i1 < nums1.size() && i2 < nums2.size()) { currentNextNum = nums1[i1] < nums2[i2] ? nums1[i1] : nums2[i2]; } else if (i1 < nums1.size()) { currentNextNum = nums1[i1]; } else if (i2 < nums2.size()){ currentNextNum = nums2[i2]; } return (currentNextNum + currentNum) / 2; } } }; int main() { Solution s; vector< int > nums1{}; vector< int > nums2{1}; cout << s.findMedianSortedArrays(nums1, nums2) << endl; return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」