代码之家  ›  专栏  ›  技术社区  ›  UmAnusorn

Kotlin上阵列中计算最大int的行数更少,并且比O(nlogn)更快?

  •  2
  • UmAnusorn  · 技术社区  · 7 年前

    我想知道是否有更好的方法或惯用的方法来计算Kotlin数组中的最大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输入: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 回复  |  直到 7 年前
        1
  •  5
  •   s1m0nw1    7 年前

    您可以这样做:

    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
    
        2
  •  1
  •   gdejohn    7 年前

    Fold 数组,其中初始值是一对 Int.MIN_VALUE 以及 0 ,如果给定元素等于给定对的第一个数(表示迄今为止看到的最大数),或者如果元素大于第一个数,则该操作返回一个新对,递增计数 1 ,或者如果元素小于第一个数字,则只返回同一对。

    这种方法只遍历数组一次,从而最大限度地减少了执行的比较次数。