刷题日记 1337. 矩阵中战斗力最弱的 K 行

114 阅读2分钟

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

一、题目描述:

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

二、思路分析:

  1. 创建两个List res、resVal,其中,resVal存放的是每一行军人1的数量,res存放的是对应目标的索引(行索引);
  2. 用for 获取每一行的数据,获取其中军人1的数量 cot,再将数量值与 resVal 中的每个值进行比较,排序,然后在索引 res 中进行对应的索引的排序;
  3. 使用数组的 Take() 方法,返回指定 k 长度的数组;

三、AC 代码:

public class Solution {
    public int[] KWeakestRows(int[][] mat, int k) {
            List<int> res = new List<int>();
            List<int> resVal = new List<int>();

            for (int i = 0; i < mat.GetLength(0); i++)
            {
                int cot = mat[i].Where(s => s == 1).Count();

                if (resVal.Count == 0 || cot > resVal.Max())
                {
                    resVal.Add(cot);
                    res.Add(i);
                }
                else if (cot < resVal.Min())
                {
                    resVal.Insert(0, cot);
                    res.Insert(0, i);
                }
                else
                {
                    for (int j = resVal.Count - 1; j >= 0; j--)
                    {
                        if (cot >= resVal[j])
                        {
                            resVal.Insert(j + 1, cot);
                            res.Insert(j + 1, i);
                            break;
                        }
                    }
                }
            }
            return res.Take(k).ToArray();
    }
}