• 算法---矩阵中战斗力最弱的 K 行(Kotlin)


    题目

    给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。

    请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。

    如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。

    军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。

    示例 1:
    
    输入:mat = 
    [[1,1,0,0,0],
     [1,1,1,1,0],
     [1,0,0,0,0],
     [1,1,0,0,0],
     [1,1,1,1,1]], 
    k = 3
    输出:[2,0,3]
    解释:
    每行中的军人数目:
    行 0 -> 21 -> 42 -> 13 -> 24 -> 5 
    从最弱到最强对这些行排序后得到 [2,0,3,1,4]
    示例 2:
    
    输入:mat = 
    [[1,0,0,0],
     [1,1,1,1],
     [1,0,0,0],
     [1,0,0,0]], 
    k = 2
    输出:[0,2]
    解释: 
    每行中的军人数目:
    行 0 -> 11 -> 42 -> 13 -> 1 
    从最弱到最强对这些行排序后得到 [0,2,3,1]
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    提示:

    m == mat.length
    n == mat[i].length
    2 <= n, m <= 100
    1 <= k <= m
    matrix[i][j] 不是 0 就是 1

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/the-k-weakest-rows-in-a-matrix
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解决方法

        fun kWeakestRows(mat: Array<IntArray>, k: Int): IntArray {
            var pair = Array(mat.size) { Array(2) { 0 } }
            mat.forEachIndexed { index, ints ->
                run {
                    pair[index][0] = index
                    mat[index].forEach {
                        pair[index][1] += it
                    }
                }
            }
    
            Arrays.sort(pair,0,pair.size) { o1, o2 -> if (o1[1] > o2[1]) 1 else if (o1[1] == o2[1]) 0 else -1 }
    
            val result = IntArray(k) { 0 }
    
            for (i in 0 until k){
                result[i] = pair[i][0]
            }
            return result
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    总结

    1.因为军人始终在前面,所以还可以根据index 判断当前行的战斗力,二分法更快的找到最大的战斗力,而不是全部都遍历

  • 相关阅读:
    档案馆:如何做到水浸事件及时预警?
    vim 多行注释
    Net相关的各类开源项目
    基于jsp+mysql+ssm峰值预警停车场管理系统-计算机毕业设计
    TPU-MLIR——实现Chatglm2-6B大模型移植部署
    千呼万唤始出来 JDK 21 LTS, 久等了
    [python 刷题] 437 Path Sum III
    双亲委派机制的作用
    Git 基础使用
    十二,HDR环境贴图卷积
  • 原文地址:https://blog.csdn.net/u013270444/article/details/125435800