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 ...
随机推荐
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器过滤器)
概念介绍 认证过滤器是MVC5的新特性,它有一个相对复杂的生命周期,它在其他所有过滤器之前运行,我们可以在认证过滤器中创建一个我们定义的认证方法,也可以结合授权过滤器做一个复杂的认证方法,这个方法可以 ...
- [scrapy]使用Anaconda来搭建scrapy的运行环境。官方推荐方法。
1.官方文档推荐. 2.一般情况下多数人使用框架的时候使用的是,安装pywin32,和openssl来搭建scrapy的运行环境.但是由于,在这样搭建环境中会遇到各种各样的问题,诸如:下载的版本有问题 ...
- 斐讯 FIR151M 频繁掉线(OpenWRT解决方案)
0. 现象与前言 在使用斐讯 FIR151M 路由器连接网络时,传输数据时频繁掉线. 官方固件刷了两个版本,问题未解决. 建议高级用户看本教程,要做好不能使用 Web 管理界面的心理准备. 1. 准备 ...
- Debian 9 中手动设置有线网络
multi-user.target中不使用networkmanager,上网需要手动设置后才可以,进行有线网线的设置: 首先得到网卡名称:ip addr or ls /sys/class/net/,以 ...
- java中集合类HashSet、ArrayList、LinkedList总结
[HashSet] 1. HashSet存储不能够存储相同的元素,元素是否相同的判断:重写元素的equals方法.equals方法和hashCode方法必须兼容,如:equals方法判断的是用户的名字 ...
- (转)Java正则表达式的语法与示例
转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串 ...
- Java集合框架体系详细梳理,含面试知识点。
一.集合类 集合的由来: 面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点: 1,用于存储对象的容器.(容器本身就 ...
- js中的undefined 和null
undefined是基本数据类型 表示未定义 缺少的意思 null是引用数据类型 是对象 表示空对象 undefined是从null派生出来的 所以undefined==null true Ja ...
- ajax 轮询 和 php长连接
只看加粗的字体 js 部分 1: ajax 成功回调函数中 一定要用时间函数间隔调用 get_comment(). get_comments('init'); function ...
- Selenium Grid分布式测试入门详解
本文对Selenium Grid进行了完整的介绍,从环境准备到使用Selenium Grid进行一次完整的多节点分布式测试. 运行环境为Windows 10,Selenium版本为 3.5.0,Chr ...