4. Median of Two Sorted Arrays(一)

题目来源https://leetcode.com/problems/median-of-two-sorted-arrays/description/


给出两个有序数组,找到两个数组的中位数。

解题思路,先不去考虑时间复杂度,时间需求才是第一要务不是?如果这样最简单的做法就是先将两个有序数组合并成一个有序数组,之后计算时间复杂度就简单了,那么开始撸码吧。

fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
    val list = arrayListOf<Int>()
    var nums2Index = 0
    //先将两个数组有序合并
    if(nums1.size != 0){
        nums1.forEach {
            val fromIndex = nums2Index
            for(i in fromIndex until nums2.size){
                if(it >= nums2[i]){
                    nums2Index++
                    list.add(nums2[i])
                }else{
                    break
                }
            }
            list.add(it)
        }
        if(nums2Index != nums2.size){
            (nums2Index until nums2.size).mapTo(list) { nums2[it] }
        }
    }else{
        if(nums2.size % 2 == 0){
            val index = nums2.size / 2
            return (nums2[index] + nums2[index - 1]) / 2.0
        }else{
            return nums2[nums2.size / 2].toDouble()
        }
    }
    //判断奇偶,计算中位数
    if(list.size % 2 == 0){
        val index = list.size / 2
        return (list[index] + list[index - 1]) / 2.0
    }else{
        return list[list.size / 2].toDouble()
    }
}
不管怎么样,功能已经实现了不是吗?但是这样你就满足了吗?如果你和我一样不满足如此简陋的代码,那么我们就继续优化吧!

首先,我们并不需要把整个数组合并完,我们需要的仅仅只是中位数,那么当中位数已经找到之后,循环就可以终止了。

下面这段代码,和上面思路一样,先有序合并数组,不过我将合并数组的代码整理了一下, 这样思路更加清晰。当数组合并到计算中位数需要的两个或一个数时,就将中位数计算出来,并终止循环。

fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
    val list = arrayListOf<Int>()
    var nums1Index = 0
    var nums2Index = 0
    val count = nums1.size + nums2.size
    val middleIndex = count / 2

    //先将两个数组有序合并
    for(i in 0 until count){
        var num1 = 0
        //防止数组越界
        if(nums1.size != 0 && nums1Index < nums1.size){
            num1 = nums1[nums1Index]
        }
        var num2 = 0
        //防止数组越界
        if(nums2.size != 0 && nums2Index < nums2.size){
            num2 = nums2[nums2Index]
        }
        //第一部分 num1 和 num2比较,将较小的一个数据加到list中
        //当nums1Index 或者 nums2Index的大小等于 数组的长度,表示该数组中数据已经取完,只需要将另外一个数组中数据加到list中即可
        if((num1 > num2 || nums1.size == nums1Index) && nums2Index < nums2.size){
            list.add(num2)
            nums2Index++
        }else if(num1 == num2){
            list.add(num2)
            list.add(num2)
            nums1Index++
            nums2Index++
        }else{
            list.add(num1)
            nums1Index++
        }
        //需要的中位数已经找到
        if(list.size > middleIndex){
            //计算中位数并返回
            return if (count % 2 == 0){
                (list[middleIndex] + list[middleIndex - 1]) / 2.0
            }else{
                list[middleIndex].toDouble()
            }
        }
    }
    return 0.0
}
代码写到这里就好了吗?显然并不符合题目要求,题目要求时间复杂度是 O(log (m+n)),而我上面写的算法时间复杂度为O((m+n)/2)


https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/

至于写法有兴趣可以去看看,里面有很多解法,大多是采用二分法排序写的,因为的还没吃透,所以暂时就不写出来丢人了,以后算法水平上去了再补上吧!!!

猜你喜欢

转载自blog.csdn.net/z89135898/article/details/79142165
今日推荐