/* * @lc app=leetcode id=1337 lang=rust * * [1337] The K Weakest Rows in a Matrix * * https://leetcode.com/problems/the-k-weakest-rows-in-a-matrix/description/ * * algorithms * Easy (68.82%) * Total Accepted: 12.6K * Total Submissions: 18.3K * Testcase Example: '[[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]]\n3' * * Given a m * n matrix mat of ones (representing soldiers) and zeros * (representing civilians), return the indexes of the k weakest rows in the * matrix ordered from the weakest to the strongest. * * A row i is weaker than row j, if the number of soldiers in row i is less * than the number of soldiers in row j, or they have the same number of * soldiers but i is less than j. Soldiers are always stand in the frontier of * a row, that is, always ones may appear first and then zeros. * * * Example 1: * * * Input: 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 * Output: [2,0,3] * Explanation: * The number of soldiers for each row is: * row 0 -> 2 * row 1 -> 4 * row 2 -> 1 * row 3 -> 2 * row 4 -> 5 * Rows ordered from the weakest to the strongest are [2,0,3,1,4] * * * Example 2: * * * Input: mat = * [[1,0,0,0], * [1,1,1,1], * [1,0,0,0], * [1,0,0,0]], * k = 2 * Output: [0,2] * Explanation: * The number of soldiers for each row is: * row 0 -> 1 * row 1 -> 4 * row 2 -> 1 * row 3 -> 1 * Rows ordered from the weakest to the strongest are [0,2,3,1] * * * * Constraints: * * * m == mat.length * n == mat[i].length * 2 <= n, m <= 100 * 1 <= k <= m * matrix[i][j] is either 0 or 1. * */ use std::collections::BTreeSet; impl Solution { pub fn k_weakest_rows(mat: Vec>, k: i32) -> Vec { let x:BTreeSet<(i32, i32)> = mat.iter().enumerate().map(|(i, r)| (r.iter().sum(), i as i32)).collect(); let mut it = x.iter(); let mut res = vec![]; for i in 0..k{ res.push(it.next().unwrap().1); } res } } // pub structSolution; use std::collections::HashMap; use std::collections::HashSet; use std::fmt::Debug; use std::hash::Hash; use std::iter::FromIterator; use std::collections::VecDeque; #[allow(dead_code)] pub fn print_map(map: &HashMap) { for (k, v) in map.iter() { println!("{:?}: {:?}", k, v); } } #[allow(dead_code)] pub fn say_vec(nums: Vec){ println!("{:?}", nums); } #[allow(dead_code)] pub fn char_frequency(s: String) -> HashMap { let mut res:HashMap = HashMap::new(); for c in s.chars(){ *res.entry(c).or_insert(0) += 1; } res } #[allow(dead_code)] pub fn vec_counter(arr: Vec) -> HashMap { let mut c = HashMap::new(); for n in arr { *c.entry(n).or_insert(0) += 1; } c } #[allow(dead_code)] pub fn vec_to_hashset(arr: Vec) -> HashSet { HashSet::from_iter(arr.iter().cloned()) }