在Kotlin上计算max int的数量越少,比O(nlogn)更快?

时间:2018-03-23 04:39:43

标签: algorithm kotlin

我想知道是否有更好的方法或惯用方法来计算Kotlin数组中的max int并且比O(nlogn)更快?

这段代码给出了O(n),但我觉得它太长了

fun countMax(n: Int, ar: Array<Int>): Int {
   val max = ar.max();
    var countMax = 0
    for(i in ar)
        if(i==max)
            countMax++

                return countMax
}

fun main(args: Array<String>) {
    val scan = Scanner(System.`in`)

    val n = scan.nextLine().trim().toInt()

    val ar = scan.nextLine().split(" ").map{ it.trim().toInt() }.toTypedArray()

    val result = birthdayCakeCandles(n, ar)

    println(result)
}

排序然后计数得到nlogn

val input:Scanner = if(inputFile.exists())Scanner(inputFile)else Scanner(System。in

fun main(args: Array<String>) {
  input.nextLine()
  val nums = input.nextLine().split(' ').map { it.toLong() }.sorted()
  val s = nums.takeLastWhile { it == nums.last() }.size
  print(s)
}

我想知道代码更短,执行速度比O(nlogn)

更快

2 个答案:

答案 0 :(得分:4)

你可以这样做:

fun countMax(ar: Array<Int>) = 
    ar.max().let { max -> ar.count { it == max } }

使用max计算最大值,然后使用count获取数组中该最大值的出现次数。

或者,对值进行分组,以max为键提取组,并映射到大小:

fun countMax(ar: Array<Int>) = 
    ar.groupBy { it }.maxBy { it.key }?.value?.size

答案 1 :(得分:1)

Fold数组,其中初始值是一对保持Int.MIN_VALUE并且计数为0,并且如果给定元素相等,则操作返回一个新的对,递增计数到给定对的第一个数字(表示到目前为止看到的最大数字),或者如果元素大于第一个数字,则它返回一个保持该元素和计数1的对,或者如果element小于第一个数字,然后它只返回同一对。

此方法仅遍历数组一次,最大限度地减少了执行的比较次数。