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

97 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

题目描述

1337**.** 矩阵中战斗力最弱的 K 行 - 力扣(LeetCode)

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

请你返回矩阵中战斗力最弱的 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]

提示:

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

思路分析

这是典型的索引绑定题型。

每一行的战斗力很容易求出,但最后要求返回的却是战斗力对应的行号。所以我们需要将每一行的战斗力和行号绑定起来,以便排序之后它们仍是正确对映的。

绑定方式多种多样,二维数组、结构体或者pair都是可以的。

为了简单我们使用二维数组作为绑定的数组结构。

AC 代码

class Solution {
public:
    static bool cmp(vector<int>& a, vector<int>& b) {
        return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0];
    }
    vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
        vector<vector<int>> temp(mat.size(), vector<int>(2));
        for (int i = 0; i < mat.size(); i++) {
            temp[i][0] = accumulate(mat[i].begin(), mat[i].end(), 0);
            temp[i][1] = i;
        }
        sort(temp.begin(), temp.end(), cmp);
        vector<int> ret;
        for (int i = 0; i < k; i++) {
            ret.push_back(temp[i][1]);
        }
        return ret;
    }
};