Kotlin实现LeetCode算法题之Median of Two Sorted Arrays
题目Median of Two Sorted Arrays(难度Hard)

方案1,数组合并&排序调用Java方法
import java.util.*
class Solution {
fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
val lenNums1 = nums1.size
val lenNums2 = nums2.size
val array = Arrays.copyOf(nums1, lenNums1 + lenNums2)
System.arraycopy(nums2, , array, lenNums1, lenNums2)
Arrays.sort(array)
var median: Double
val lenArray = array.size
== ) {
median = array[(lenArray - ) / ].toDouble()
} else {
median = (array[(lenArray - ) / ] + array[lenArray / ]).toDouble() /
}
return median
}
}
提交详情1

平均耗时0.25ms。
方案2,数组合并&排序调用Kotlin方法
class Solution {
fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
val lenNums1 = nums1.size
val lenNums2 = nums2.size
val array = IntArray(lenNums1 + lenNums2)
System.arraycopy(nums1, , array, , lenNums1)
System.arraycopy(nums2, , array, lenNums1, lenNums2)
array.sort()
var median: Double
val lenArray = array.size
== ) {
median = array[(lenArray - ) / ].toDouble()
} else {
median = (array[(lenArray - ) / ] + array[lenArray / ]).toDouble() /
}
return median
}
}
提交详情2

平均耗时0.27ms。
Java & Kotlin代码对比
其实,通过源码可以发现,方案1和2在对数组进行合并与排序时调用的方法是一样的。
Arrays.java
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, , copy, ,
Math.min(original.length, newLength));
return copy;
}
copyOf方法内部调用的还是System的静态方法arraycopy(native就不往下追了)。
System.java
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
Arrays.kt
/** * Creates a new array of the specified [size], where each element is calculated by calling the specified * [init] function. The [init] function returns an array element given its index. */ public inline constructor(size: Int, init: (Int) -> Int)
IntArray(size: Int)会生成一个大小为size,元素值由init方法利用下标值计算而来,如果init不传入,那么默认均为0。
Arrays.kt
public fun IntArray.sort(): Unit {
) java.util.Arrays.sort(this)
}
Kotlin中IntArray的扩展方法sort,内部调用的是Java中Arrays的sort方法。
Arrays.java
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, , a.length - , , );
}
Arrays的sort方法最终是通过快排来实现的。而快速排序的时间复杂度为O(nlog(n)),但是题目要求量级为O(log(m+n))。
方案3,分治法求中位数
class Solution {
fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
var media1: Int
val len1 = nums1.size
val len2 = nums2.size
== ) {
media1 = getMedian(nums1, nums2, , len1 - , , len2 - , (len1 + len2) / + )
return media1 / 1.0
} else {
media1 = getMedian(nums1, nums2, , len1 - , , len2 - , (len1 + len2) / )
media2 = getMedian(nums1, nums2, , len1 - , , len2 - , (len1 + len2) / + )
return (media1 + media2) / 2.0
}
}
fun getMedian(nums1: IntArray, nums2: IntArray, s1: Int, n1: Int, s2: Int, n2: Int, k: Int): Int {
val x = (s1 + n1) /
val y = (s2 + n2) /
if (s1 > n1)
]
if (s2 > n2)
]
return if (nums1[x] <= nums2[y]) {
) {
getMedian(nums1, nums2, s1, n1, s2, y - , k)
} else {
getMedian(nums1, nums2, x + , n1, s2, n2, k - (x - s1) - )
}
} else {
) {
getMedian(nums1, nums2, s1, x - , s2, n2, k)
} else {
getMedian(nums1, nums2, s1, n1, y + , n2, k - (y - s2) - )
}
}
}
}
提交详情3

平均耗时0.32ms。
结果分析
但从LeetCode的测试用例所消耗的时间来看,上述三种方案没有明显的区别,理论上分治法的时间复杂度为O(log(n))。
Kotlin实现LeetCode算法题之Median of Two Sorted Arrays的更多相关文章
- 算法题之Median of Two Sorted Arrays
这道题是LeetCode上的题目,难度级别为5,刚开始做没有找到好的思路,以为是自己智商比较低,后来发现确实也比较低... 题目: There are two sorted arrays nums1 ...
- leetcode第四题:Median of Two Sorted Arrays (java)
Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...
- 刷题4. Median of Two Sorted Arrays
一.题目 Median of Two Sorted Arrays,具体请自行搜索. 这个题目,我看了一下,经过一番思考,我觉得实现起来不是很复杂. 但要做到bug free也不难,最大的问题是性能问题 ...
- Kotlin实现LeetCode算法题之Two Sum
LeetCode介绍 LeetCode是算法练习.交流等多功能网站,感兴趣的同学可以关注下(老司机请超车).页面顶部的Problems菜单对应算法题库,附带历史通过滤.难易程度等信息. 未来计划 打算 ...
- 【LeetCode每天一题】Median of Two Sorted Arrays(两数组中的中位数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the tw ...
- 【LeetCode】4、Median of Two Sorted Arrays
题目等级:Hard 题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find t ...
- LeetCode(4)Median of Two Sorted Arrays
题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- LeetCode解题笔记 - 4. 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 ...
- LeetCode 笔记系列一 Median of Two Sorted Arrays
题目:There are two sorted arrays A and B of size m and n respectively. Find the median of the two sort ...
随机推荐
- Spring ——简介及环境搭建跑通Hello
Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.是为了解决企业应用程序开发复杂性而创建的.框架的主要优 ...
- Intel Core Microarchitecture Pipeline
Intel微处理器近20年从Pentium发展到Skylake,得益于制作工艺上的巨大发展,处理器的性能得到了非常大的增强,功能模块增多,不过其指令处理pipeline的主干部分算不上有特别大的变化, ...
- 从给数组中的对象去重看Javascript中的reduce()
假设有这样一个数组: let person = [ {id: 0, name: "小明"}, {id: 1, name: "小张"}, {id: 2, name ...
- 【特效】select美化
select的默认样式往往很丑,为保证页面样式风格统一,需要对select进行美化.虽然其美化的插件很多,一搜一大把,但是需要引入长长的css文件和js文件实在是件头痛的事.其实select的实现原理 ...
- java 集合之实现类ArrayList 和 LinkedList
List 的方法列表 方法名 功能说明 ArrayList() 构造方法,用于创建一个空的数组列表 add(E e) 将指定的元素添加到此列表的尾部 get(int index) 返回此列表中指定位置 ...
- CentOS 6.5 中安装 Mysql 5.6,并远程连接Mysql
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.在安装CentOS时,若选择的是Basic Server(可支持J2EE开发),则新安装好的CentOS系统中默认是已经安装了一个mysq ...
- 在HBulider中如何快速的生成有序(ol)和无序(ul)列表
首先你需要创建一个HTML文件,然后在body里面写入你要创建的类型(有序或者无序),然后列表的个数个人来定: 格式如下: ul > li * 5 代表我要创建一个列表为5个的无序类型 然 ...
- UVa10791 - Minimum Sum LCM
分析即为紫薯上的分析. 难点是发现当每个aipi作为一个单独的整数时才最优.. 答案就是将所有不同的 相同因子的积 相加即可 代码: #include<cstdio> #include&l ...
- java如何调用接口方式二
java如何调用接口 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,所以,问题来了,java如何调用接口?很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对 ...
- Azure 基础:使用 powershell 创建虚拟机
在进行与 azure 相关的自动化过程中,创建虚拟主机是避不开的操作.由于系统本身的复杂性,很难用一两条简单的命令完成虚拟主机的创建.所以专门写一篇文章来记录使用 PowerShell 在 azure ...