我是靠谱客的博主 唠叨诺言,最近开发中收集的这篇文章主要介绍Leetcode笔记10-寻找两个正序数组的中位数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目描述

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

思路

1)最明显的思路是将两个数组进行合并,然后直接查找中位数
2)第二个方法是用两个指针分别指向两个数组,比较大小,小的向后移一位,从而找到中位数所在的位置,就不需要将两个数组全部进行排序,而变成了查找第(m+n)/2个数。当然实际情况想象的复杂一些,比如考虑到是否存在空数组、是否有一个数组中的指针移动到了最后还是没有找到中位数、当总数为偶数时前一个中位数的下一个数应该是哪个指针所指的数(还要考虑指针是否到了数组尾部)…
总而言之,第二种方法实现起来比较复杂,考虑的东西更多,我也是在多次提交报错之后才完整考虑了所有的情况。所以最后修改的自己可能也有点看不懂了。。

实现代码

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int count=nums1Size+nums2Size;
    int mid=count/2;
    int i=0,j=0;
    if(nums1Size==0){
        if(nums2Size%2==0){
            return (nums2[nums2Size/2-1]+nums2[nums2Size/2])/2.0;
        } else{
            return nums2[nums2Size/2];
        }
    }
    if(nums2Size==0){
        if(nums1Size%2==0){
            return (nums1[nums1Size/2-1]+nums1[nums1Size/2])/2.0;
        } else{
            return nums1[nums1Size/2];
        }
    }
    if(count%2==1){        
        while((i+j)<mid&&i<nums1Size&&j<nums2Size){
            if(nums1[i]<nums2[j]){
                i++;
            }else{
                j++;
            }
        }       
        if(i==nums1Size){
            i--;
            while((i+j)<mid-1){
                j++;
            }
            return nums2[j];
        }else if(j==nums2Size){
            j--;
            while((i+j)<mid-1){
                i++;
            }
            return nums1[i];
        }else {
            if(nums1[i]<nums2[j]){
                return nums1[i];
            }else{
                return nums2[j];
            }            
        }
        
    }else{        
        while((i+j)<(mid-1)&&i<nums1Size&&j<nums2Size){
            if(nums1[i]<nums2[j]){
                i++;
            }else{
                j++;
            }
        }       
        if(i==nums1Size){
            i--;
            while((i+j)<mid){
                j++;
            }
            return (nums2[j-1]+nums2[j-2])/2.0;
        }else if(j==nums2Size){
            j--;
            while((i+j)<mid){
                i++;
            }
            return (nums1[i-1]+nums1[i-2])/2.0;
        }else {
            if(nums1[i]<nums2[j]){
                if(i+1==nums1Size){
                    return (nums1[i]+nums2[j])/2.0;
                }                
                if(nums1[i+1]<nums2[j]){
                    return (nums1[i]+nums1[i+1])/2.0;
                }else{
                    return (nums1[i]+nums2[j])/2.0;
                }
            }else {
                if(j+1==nums2Size){
                    return (nums2[j]+nums1[i])/2.0;
                }                
                if(nums2[j+1]<nums1[i]){
                    return (nums2[j]+nums2[j+1])/2.0;
                }else{
                    return (nums2[j]+nums1[i])/2.0;
                }
            }             
        }
    }
    //return 0;
}

最后

以上就是唠叨诺言为你收集整理的Leetcode笔记10-寻找两个正序数组的中位数的全部内容,希望文章能够帮你解决Leetcode笔记10-寻找两个正序数组的中位数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部