美文网首页LeetCode
寻找两个有序数组的中位数

寻找两个有序数组的中位数

作者: 习惯了_就好 | 来源:发表于2019-04-23 16:45 被阅读0次
    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
    
    请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
    
    你可以假设 nums1 和 nums2 不会同时为空。
    
    示例 1:
    
    nums1 = [1, 3]
    nums2 = [2]
    
    则中位数是 2.0
    
    示例 2:
    
    nums1 = [1, 2]
    nums2 = [3, 4]
    
    则中位数是 (2 + 3)/2 = 2.5
    
    提交1:
    先把两个数组合并成一个,然后通过冒泡排序给数组排序,最后找到中位数。
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int[] array;
            
            if(nums1.length == 0){
                array = nums2;
            }else if(nums2.length == 0){
                array = nums1;
            }else{
                array = new int[nums1.length + nums2.length];
                
                for(int i = 0;i < nums1.length;i++){
                    array[i] = nums1[i];
                }
                for(int i = 0;i < nums2.length;i++){
                    array[nums1.length + i] = nums2[i];
                }
                array = sort(array);
            }
            
            if(array.length % 2 == 0){
                    return (array[array.length / 2 - 1] + array[array.length / 2]) / 2.0;
                }else{
                    return (array[array.length / 2 ]);
                }
        }
        
        private int[] sort(int[] nums){
            int temp;
            for(int i = 0;i < nums.length;i++){
                for(int j = i + 1;j < nums.length;j++){
                    if(nums[i] > nums[j]){
                        temp =nums[j];
                        nums[j] = nums[i];
                        nums[i] = temp;
                    }
                }
            }
            return nums;
        }
    }
    
    提交2:
    先对数组1和数组2排序,然后依次遍历两个数组,按从小到大的顺序放到新数组里,取出中位数。
    
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int[] array = new int[nums1.length + nums2.length];
            nums1 = sort(nums1);
            nums2 = sort(nums2);
            
            int i = 0;
            int j = 0;
            int index = 0;
            while(i < nums1.length && j< nums2.length){
                if(nums1[i] < nums2[j]){
                    array[index] = nums1[i];
                    i++;
                }else{
                    array[index] = nums2[j];
                    j++;
                }
                index++;
            }
            
            if(i == nums1.length && j == nums2.length){
                
            }else if(i == nums1.length){
                for(int k = j;k < nums2.length;k++,index++){
                     array[index] = nums2[k];
                }
            }else if(j == nums2.length){
                for(int k = i;k < nums1.length;k++,index++){
                     array[index] = nums1[k];
                }
            }
            
            
            if(array.length % 2 == 0){
                return (array[array.length / 2 - 1] + array[array.length / 2]) / 2.0;
            }else{
                return (array[array.length / 2 ]);
            }
        }
        
        private int[] sort(int[] nums){
            int temp;
            for(int i = 0;i < nums.length;i++){
                for(int j = i + 1;j < nums.length;j++){
                    if(nums[i] > nums[j]){
                        temp =nums[j];
                        nums[j] = nums[i];
                        nums[i] = temp;
                    }
                }
            }
            return nums;
        }
    }
    
    提交3:
    将提交1的排序改为快速排序
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int[] array;
            
            if(nums1.length == 0){
                array = nums2;
            }else if(nums2.length == 0){
                array = nums1;
            }else{
                array = new int[nums1.length + nums2.length];
                
                for(int i = 0;i < nums1.length;i++){
                    array[i] = nums1[i];
                }
                for(int i = 0;i < nums2.length;i++){
                    array[nums1.length + i] = nums2[i];
                }
                sort(array,0,array.length-1);
            }
            
            if(array.length % 2 == 0){
                    return (array[array.length / 2 - 1] + array[array.length / 2]) / 2.0;
                }else{
                    return (array[array.length / 2 ]);
                }
        }
        
        private void sort(int[] arr,int _left,int _right){
            int left = _left;
            int right = _right;
            int temp = 0;
            if(left <= right){   //待排序的元素至少有两个的情况
                temp = arr[left];  //待排序的第一个元素作为基准元素
                while(left != right){   //从左右两边交替扫描,直到left = right
    
                    while(right > left && arr[right] >= temp)  
                         right --;        //从右往左扫描,找到第一个比基准元素小的元素
                      arr[left] = arr[right];  //找到这种元素arr[right]后与arr[left]交换
    
                    while(left < right && arr[left] <= temp)
                         left ++;         //从左往右扫描,找到第一个比基准元素大的元素
                      arr[right] = arr[left];  //找到这种元素arr[left]后,与arr[right]交换
    
                }
                arr[right] = temp;    //基准元素归位
                sort(arr,_left,left-1);  //对基准元素左边的元素进行递归排序
                sort(arr, right+1,_right);  //对基准元素右边的进行递归排序
            } 
        }
        
    }
    

    相关文章

      网友评论

        本文标题:寻找两个有序数组的中位数

        本文链接:https://www.haomeiwen.com/subject/mrtbgqtx.html