列表

详情


1337. 矩阵中战斗力最弱的 K 行

给你一个大小为 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 -> 2 
行 1 -> 4 
行 2 -> 1 
行 3 -> 2 
行 4 -> 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 -> 1 
行 1 -> 4 
行 2 -> 1 
行 3 -> 1 
从最弱到最强对这些行排序后得到 [0,2,3,1]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> kWeakestRows(vector<vector<int>>& mat, int k) { } };

golang 解法, 执行用时: 24 ms, 内存消耗: 4.8 MB, 提交时间: 2021-06-15 17:33:57

func kWeakestRows(mat [][]int, k int) []int {
    res := make([]int,len(mat))
    for i, row := range mat {
        res[i] = countOne(row)*100 + i
    }
    sort.Ints(res)
    for i := 0; i < k; i++{
        res[i] = res[i]%100
    }
    return res[:k]

}

func countOne(nums []int) int {
    res := 0
    for _, num := range nums {
        res += num
    }
    //返回1的个数
    return res
}

golang 解法, 执行用时: 20 ms, 内存消耗: 4.9 MB, 提交时间: 2021-06-15 17:29:08

func kWeakestRows(mat [][]int, k int) []int {
    r, c := len(mat), len(mat[0])
    row := make([]int, r)
    num := make([]int, r)
    for i := 0; i < r; i++ {
        num[i] = i
        for j := 0; j < c; j++ {
            if mat[i][j] == 0 {
                break
            }
            row[i] += mat[i][j]
        }
    }

	sort.Slice(num, func(i, j int) bool {
		if ( row[num[i]] != row[num[j]] ) {
            return row[num[i]] < row[num[j]]
        }
        return num[i] < num[j]
	})
    return num[:k]
}

上一题