1337. 矩阵中战斗力最弱的 K 行(C++)
1 题目描述
给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。
请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
2 示例描述
2.1 示例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.2 示例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]
3 解题提示
m == mat.length
n == mat[i].length
2 <= n, m <= 100
1 <= k <= m
matrix[i][j] 不是 0 就是 1
4 解题思路
暴力求解
5 源码详解(C++)
class Solution {
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
int sum[100] = {
0 };
vector<int> res ;
for ( int i = 0 ; i < mat.size() ; i ++ )
{
for ( int j = 0 ; j < mat[i].size() ; j ++ )
{
sum[i] = sum[i] + mat[i][j] ;
}
}
for ( int i = 0 ; i <= mat[0].size() ; i ++ )
{
for ( int j = 0 ; j < mat.size() ; j ++ )
{
if ( sum[j] == i )
{
res.push_back( j ) ;
if ( res.size() == k )
{
return res ;
}
}
}
}
return {
0 } ;
}
};
6 错误思路
更好理解的暴力求解。
7 源码详解(C++)
class Solution {
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
int n[100] = {
0 } , sum = 0 ;
for ( int i = 0 ; i < mat.size() ; i ++ )
{
sum = 0 ;
for ( int j = 0 ; j < mat[i].size() ; j ++ )
{
sum = sum + mat[i][j] ;
}
n[i] = sum ;
}
vector<int> index ;
for ( int i = 0 ; i < mat.size() -1 ; i ++ )
{
if ( n[i] <= n[i + 1] )
{
index.push_back( i ) ;
}
}
//转换到数组排排序,留两个数组,一个是数值,一个是下标。
int count = index.size() ;
int number[100] = {
0 } , arr_index[100] = {
0 } ;
for ( int i = 0 ; i < index.size() ; i ++ )
{
number[i] = n[index[i]] ;
arr_index[i] = index[i] ;
}
//排序
int temp = 0 ;
for ( int i = 0 ; i < index.size() - 1 ; i ++ )
{
for ( int j = i + 1 ; j < index.size() ; j ++ )
{
if ( number[i] < number[j] )
{
//交换数字
temp = number[i] ;
number[i] = number[j] ;
number[j] = temp ;
//交换下标
temp = arr_index[i] ;
arr_index[i] = arr_index[j] ;
arr_index[j] = temp ;
}
}
}
for ( int i = 0 ; i < index.size() ; i ++ )
{
index.push_back( arr_index[i] ) ;
}
return index ;
}
};