【LeetCode】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 ;
    }
};

猜你喜欢

转载自blog.csdn.net/Gyangxixi/article/details/114314987