鱼C论坛

 找回密码
 立即注册
查看: 1291|回复: 1

[技术交流] C++打开LeetCCode的大门---------004(数组)

[复制链接]
发表于 2020-5-22 22:39:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 这是她 于 2020-5-24 21:38 编辑

                                                                                             寻找两个正序数组的中位数
题目:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例1:
  1. nums1 = [1, 3]
  2. nums2 = [2]

  3. 则中位数是 2.0
复制代码
示例2:
  1. nums1 = [1, 2]
  2. nums2 = [3, 4]

  3. 则中位数是 (2 + 3)/2 = 2.5
复制代码
代码:
  1. #include <stdio.h>
  2. #include <vector>

  3. using namespace std;

  4. #define max(a,b) (((a) > (b)) ? (a) : (b))
  5. #define min(a,b) (((a) < (b)) ? (a) : (b))
  6. #define INT_MIN
  7. #define INT_MAX

  8. class Solution {
  9. public:
  10.         double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
  11.                 //动态数组的大小
  12.                 int n = nums1.size();
  13.                 int m = nums2.size();

  14.                 //保证动态数组Array中第一个数组最短
  15.                 if (n > m)
  16.                 {
  17.                         return findMedianSortedArrays(nums2, nums1);
  18.                 }
  19.                
  20.                 //c1->第一个数组被分开的标记;LMax1->第一个数组被分开以后的左元素;LMin1->第一个数组被分开以后的右元素;
  21.                 //c2->第二个数组被分开的标记;LMax2->第二个数组被分开以后的左元素;LMin2->第二个数组被分开以后的右元素;
  22.                 int LMax1, LMax2, RMin1, RMin2, c1, c2, low = 0, hig = 2 * n;  //我们目前是虚拟加了'#'所以数组1是2*n长度

  23.                 while (low <= hig)   //二分
  24.                 {
  25.                         c1 = (low + hig) / 2;  //c1是二分的结果
  26.                         c2 = m + n - c1;//两个数组虚拟加了#,所以每个数组的个数是奇数个。2c1+1+2c2+1=2m+2n+2->c1+c2=m+n->c2=m+n-c1

  27.                         LMax1 = (c1 == 0) ? INT_MIN : nums1[(c1 - 1) / 2];
  28.                         RMin1 = (c1 == 2 * n) ?
  29.                         INT_MAX : nums1[c1 / 2];
  30.                         LMax2 = (c2 == 0) ? INT_MIN : nums2[(c2 - 1) / 2];
  31.                         RMin2 = (c2 == 2 * m) ? INT_MAX : nums2[c2 / 2];

  32.                         if (LMax1 > RMin2)
  33.                                 hig = c1 - 1;
  34.                         else if (LMax2 > RMin1)
  35.                                 low = c1 + 1;
  36.                         else
  37.                                 break;
  38.                 }
  39.                 return (max(LMax1, LMax2) + min(RMin1, RMin2)) / 2.0;
  40.         }
  41. };


  42. int main(int argc, char *argv[])
  43. {
  44.         vector<int> nums1 = (2,3,5);
  45.         vector<int> nums2 = {1,4,7,9};
  46.        
  47.         Solution solution;
  48.         double ret = solution.findMedianSortedArrays(nums1, nums2);
  49.         return 0;
  50. }
复制代码

https://leetcode-cn.com/problems ... u-de-zhong-wei-shu/


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-23 08:17:07 | 显示全部楼层
学习学习,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 20:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表