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