• Median of Two Sorted Arrays


    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    Subscribe to see which companies asked this question

      1 class Solution {
      2 public:
      3     /*
      4      * 首先的想法是用额外的一个vector保存排好序的数组,快速排序 o(nlogn)
      5      *
      6      */
      7     double _findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
      8         vector<int>::iterator it;
      9         vector<int> all_nums;
     10 
     11         for (it=nums1.begin(); it!=nums1.end(); it++) {
     12             all_nums.push_back(*it);
     13         }
     14 
     15         for (it=nums2.begin(); it!=nums2.end(); it++) {
     16             all_nums.push_back(*it);
     17         }
     18 
     19         sort(all_nums.begin(), all_nums.end());
     20 
     21         int len_all_nums = all_nums.size();
     22         if (len_all_nums % 2 == 1) {
     23             return all_nums[len_all_nums / 2];
     24         } else {
     25             double mid_left = all_nums[len_all_nums / 2 - 1];
     26             double mid_right = all_nums[len_all_nums / 2];
     27             double mid_num = (mid_left + mid_right) / 2;
     28             return mid_num;
     29         }
     30     }
     31     /*
     32      * 也可以转换为找到两个排序链表的第i个数, 不过太麻烦了
     33      * 1.
     34      * */
     35    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     36         int all_len = nums1.size() + nums2.size();
     37         int first_index = -1;
     38         int second_index = -1;
     39         if (all_len % 2 == 1) {
     40             first_index = all_len / 2;
     41         } else {
     42             first_index = all_len / 2 - 1;
     43             second_index = all_len / 2;
     44         }
     45         double first_num = 0;
     46         double second_num = 0;
     47         //下面就是找到对应的数
     48         int n1 = 0;
     49         int n2 = 0;
     50         int find_index = 0;
     51         for (;find_index<first_index; find_index++) {
     52             if ((n1 < nums1.size()) && (n2< nums2.size())) {
     53                 if (nums1[n1] <= nums2[n2]) {
     54                     n1++;
     55                 } else {
     56                     n2++;
     57                 }
     58             } else if(n1 < nums1.size()) {
     59                 n1++;
     60             } else {
     61                 n2++;
     62             }
     63         }
     64 
     65         if (n1 == nums1.size()) {
     66             first_num = nums2[n2];
     67             if (second_index != -1) {
     68                 second_num = nums2[n2 + 1];
     69             }
     70         } else if (n2 == nums2.size()) {
     71             first_num = nums1[n1];
     72             if (second_index != -1) {
     73                 second_num = nums1[n1 + 1];
     74             }
     75         } else {
     76             /*
     77             first_num = min(nums1[n1], nums2[n2]);
     78             //second_num = max(nums1[n1], nums2[n2]);
     79             if ((n1 + 1) < nums1.size()) {
     80                 second_num = min(nums1[n1 + 1], nums2[n2]);
     81             } else {
     82                 second_num = nums2[n2];
     83             }
     84             */
     85             if (nums1[n1] <= nums2[n2]) {
     86                 first_num = nums1[n1];
     87                 if ((n1 + 1) < nums1.size()) {
     88                     second_num = min(nums1[n1 + 1], nums2[n2]);
     89                 } else {
     90                     second_num = nums2[n2];
     91                 }
     92             } else {
     93                 first_num = nums2[n2];
     94                 if ((n2 + 1) < nums2.size()) {
     95                     second_num = min(nums1[n1], nums2[n2 + 1]);
     96                 } else {
     97                     second_num = nums1[n1];
     98                 }
     99             }
    100         }
    101 
    102         if (second_index != -1) {
    103             return (first_num + second_num) / 2.0;
    104         } else {
    105             return first_num;
    106         }
    107    }
    108 };
  • 相关阅读:
    制作在线简历(一)——Loading与底部菜单
    然而这并没有什么卵用
    移动开发中Fiddler的那些事儿
    多种方法实现Loading(加载)动画效果
    总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
    SQLServer和MySQL job和 event定时器的差别
    全局ID的重要性
    Windows操作系统上各种服务使用的端口号, 以及它们使用的协议的列表
    Linux发展历史图
    奇特的Local System权限(转载)
  • 原文地址:https://www.cnblogs.com/SpeakSoftlyLove/p/5095202.html
Copyright © 2020-2023  润新知