zoukankan      html  css  js  c++  java
  • 004 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)).
    Example 1:
    nums1 = [1, 3]
    nums2 = [2]
    The median is 2.0

    Example 2:
    nums1 = [1, 2]
    nums2 = [3, 4]
    The median is (2 + 3)/2 = 2.5

    详见:https://leetcode.com/problems/median-of-two-sorted-arrays/description/

    Java实现:

    方法一:常规解法

    import java.util.Arrays;
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int size1=nums1.length;
            int size2=nums2.length;
            int size=size1+size2;
            int[] nums = new int[size];
            for(int i = 0; i<size1; i++){
                nums[i] = nums1[i];
            }
            for(int i = size1; i<size; i++){
                nums[i] = nums2[i-size1];
            }        
            Arrays.sort(nums);
            double median;
            if((size-1)%2 == 0){
                median = nums[(size-1)/2] * 1.0;    
            } else {
                median = (nums[(size-1)/2] + nums[((size-1)/2)+1])/2.0;
            }
            return median;
        }
    }
    

     方法二:求第k小的数

    public class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int size1 = nums1.length;
            int size2 = nums2.length;
            int size = size1 + size2;
            if(size % 2 == 1){
                return findKth(nums1, 0, size1, nums2, 0, size2, size / 2 + 1);
            }else{
                return (findKth(nums1, 0, size1, nums2, 0, size2, size / 2) + findKth(nums1, 0, size1, nums2, 0, size2, size / 2 + 1)) /2;
            }
        }
        public double findKth(int[] nums1, int start1, int size1, int[] nums2, int start2, int size2, int k){
            if(size1 - start1 > size2 -start2){
                return findKth(nums2, start2, size2, nums1, start1, size1, k);
            }            
            if(size1 - start1 == 0){
                return nums2[k - 1];
            }
            if(k == 1){
                return Math.min(nums1[start1], nums2[start2]); // k==1表示已经找到第k-1小的数,下一个数为两个数组start开始的最小值
            }
            int p1 = start1 + Math.min(size1 - start1, k / 2); // p1和p2记录当前需要比较的那个位
            int p2 = start2 + k - p1 + start1;
            if(nums1[p1 - 1] < nums2[p2 - 1]){
                return findKth(nums1,  p1, size1, nums2, start2, size2, k - p1 + start1);
            }else if(nums1[p1 - 1] > nums2[p2 -1]){
                return findKth(nums1, start1, size1, nums2, p2, size2, k - p2 + start2);
            }else{
                return nums1[p1 - 1];
            }
        }
    }
    

    C++实现:

     1 class Solution {
     2 public:
     3     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     4         int size1=nums1.size();
     5         int size2=nums2.size();
     6         int size=size1+size2;
     7         if(size&0x1)
     8             return findKTh(nums1.begin(),size1,nums2.begin(),size2,size/2+1);
     9         else
    10             return (findKTh(nums1.begin(),size1,nums2.begin(),size2,size/2)+findKTh(nums1.begin(),size1,nums2.begin(),size2,size/2+1))/2;
    11     }
    12     double findKTh(vector<int>::iterator nums1,int m,vector<int>::iterator nums2,int n,int k)
    13     {
    14         if(m>n)
    15             return findKTh(nums2,n,nums1,m,k);
    16         if(m==0)
    17             return *(nums2+k-1);
    18         if(k==1)
    19             return min(*nums1,*nums2);
    20         int pa=min(k/2,m),pb=k-pa;
    21         if(*(nums1+pa-1)<*(nums2+pb-1))
    22             return findKTh(nums1+pa,m-pa,nums2,n,k-pa);
    23         else if(*(nums1+pa-1)>*(nums2+pb-1))
    24             return findKTh(nums1,m,nums2+pb,n-pb,k-pb);
    25         else
    26             return *(nums1+pa-1);
    27     }
    28 };

    参考:

    https://www.cnblogs.com/leavescy/p/5877627.html

    https://www.cnblogs.com/bakari/p/5082155.html

    http://blog.csdn.net/yutianzuijin/article/details/11499917/

  • 相关阅读:
    Blob对象转File对象
    TCP的三次握手 与 四次挥手
    HTTP协议 与 TCP协议 的区别
    tcp四次挥手
    tcp协议
    tcp的三次握手
    关于HTTP协议 && TCP协议的一些理解
    Javascript数组中常用的排序法 ——冒泡排序法和选择排序法以及快速排序法
    如何用Bat批处理自制自解压文件
    [SQL]查询所有数据库、表名、表字段总结
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8618958.html
Copyright © 2011-2022 走看看