【数组】- 矩阵中战斗力最弱的 K 行

215 阅读1分钟

题目:给你一个大小为 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]。

提示: 

  •  m == mat.length 

  • n == mat[i].length 

  • 2 <= n, m <= 100 

  • 1 <= k <= m 

  • matrix[i][j] 不是 0 就是 1 

分析:

  • 返回一个长度为k的数组

  • 数组时按照1的数量从小到大排列

  • 1数量相同,靠后的比前面的强

  • 1都在前

思路1:

  • 创建一个数组result,保存每一行的1的个数,以及它的位于哪一行
  • 遍历矩阵,如果为1,就个数加1,不为1,跳出本次循环,并记录行数。
  • result遍历排序
  • result遍历取出所有的i,存入resultArr。

   代码:

/** * @param {number[][]} 
    mat * @param {number} 
    k * @return {number[]}
 */
var kWeakestRows = function(mat, k) {
    const result =[];
    for(let i = 0; i < mat.length; i++) {    
        let count = 0;    
        for(let j = 0; j < mat[i].length; j++){       
            const val = mat[i][j]         
            if (val === 1) {            
                count ++;        
            } else {            
                break;        
            }    
        }     
        result.push({count, i})}
    }
    
    for(let i =0; i<result.length -1  ;i++){    
        for(let j = 1; j<result.length;j++){        
            if (result[i].count > result[i].count) {            
                const temp = result[i];            
                result[i] = result[j];            
                result[j] = temp;        
            }    
        }
    }

    let resultArr = [];
    for(let i =0; i < result.length; i++){    
        resultArr.push(result.i)}
        return resultArr;
    }; 
}