题目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的更多相关文章

  1. 算法题之Median of Two Sorted Arrays

    这道题是LeetCode上的题目,难度级别为5,刚开始做没有找到好的思路,以为是自己智商比较低,后来发现确实也比较低... 题目: There are two sorted arrays nums1  ...

  2. 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 ...

  3. 刷题4. Median of Two Sorted Arrays

    一.题目 Median of Two Sorted Arrays,具体请自行搜索. 这个题目,我看了一下,经过一番思考,我觉得实现起来不是很复杂. 但要做到bug free也不难,最大的问题是性能问题 ...

  4. Kotlin实现LeetCode算法题之Two Sum

    LeetCode介绍 LeetCode是算法练习.交流等多功能网站,感兴趣的同学可以关注下(老司机请超车).页面顶部的Problems菜单对应算法题库,附带历史通过滤.难易程度等信息. 未来计划 打算 ...

  5. 【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 ...

  6. 【LeetCode】4、Median of Two Sorted Arrays

    题目等级:Hard 题目描述:   There are two sorted arrays nums1 and nums2 of size m and n respectively.   Find t ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

    [网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院  欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...

  2. thinkphp5.0解决控制器驼峰命名时提示找不到类名

    今天碰到了一个比较坑爹的问题,我的控制器的名字是用驼峰命名的,但是却给我报错,如下: 怎么解决呢? 看我的视图,同样是驼峰命名,此时只要将其改为auth_group这样的方式就可以了. 注意:url地 ...

  3. 【转载】使用CSS将图片转换成黑白(灰色、置灰)

    文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=2547原文摘要: . ...

  4. Windows 10「设置」应用完整MS-Settings快捷方式汇总

    分类 设置名称 快捷方式 系统 显示 ms-settings:display 通知和操作 ms-settings:notifications 平板电脑模式 ms-settings:tabletmode ...

  5. HTML5之indexedDB

    从陌生到了解,花了一下午的时间,以下的地址还是不错的参考资料,省的到处去找 HTML5本地存储——IndexedDB(一:基本使用) 官方API接口文档 官方使用示例 html5 初试 indexed ...

  6. [poj1644]放苹果

    题目链接:http://poj.org/problem?id=1664       把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5, ...

  7. Yii2之类自动加载

    在yii中,程序中需要使用到的类无需事先加载其类文件,在使用的时候才自动定位类文件位置并加载之,这么高效的运行方式得益于yii的类自动加载机制. Yii的类自动加载实际上使用的是PHP的类自动加载,所 ...

  8. Yii2之ListView小部件

    ListView是yii框架中类似GridView,也是用于展示多条数据的小部件,相比GridView,ListView可以更加灵活地设置数据展示的格式. 下面以我自己做的一个使用ListView来展 ...

  9. MongoDB索引限制

    1. 额外开销: 每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作.所以,如果你很少对集合进行读取操作,建议不使用索引. 2. 内存使用: 由于索引是存储在内存(RAM)中 ...

  10. IIS部署网站时常见问题解决

    首先服务器上安装IIS和Framework\v4.0 一.打开iis服务管理器 左侧目录中选择网站右键,选择添加网站 填写网站名称.选择项目存放的路径.ip地址和端口 VS用的是4.0,iis中网站也 ...