The K Weakest Rows in a Matrix

easy heap matrix

Problem

You are given an m × n binary matrix mat where 1 = soldier and 0 = civilian. Soldiers stand to the left of civilians in every row. Return the indices of the k weakest rows ordered from weakest to strongest — weaker means fewer soldiers, with row index as a tiebreaker.

Inputmat = [[1,1,0,0],[1,0,0,0],[1,1,1,1],[1,1,0,0]], k = 2
Output[1, 0]
Row strengths = [2,1,4,2]. Two weakest sorted by (count, idx): row 1 (1 soldier), then row 0 (2 soldiers, smaller index).

import heapq

def k_weakest_rows(mat, k):
    pairs = [(sum(row), i) for i, row in enumerate(mat)]
    return [i for _, i in heapq.nsmallest(k, pairs)]
function kWeakestRows(mat, k) {
  const pairs = mat.map(function (row, i) {
    return [row.reduce(function (a, b) { return a + b; }, 0), i];
  });
  pairs.sort(function (a, b) { return a[0] - b[0] || a[1] - b[1]; });
  return pairs.slice(0, k).map(function (p) { return p[1]; });
}
class Solution {
    public int[] kWeakestRows(int[][] mat, int k) {
        PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) ->
            a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
        for (int i = 0; i < mat.length; i++) {
            int c = 0;
            for (int v : mat[i]) c += v;
            pq.offer(new int[]{c, i});
        }
        int[] ans = new int[k];
        for (int i = 0; i < k; i++) ans[i] = pq.poll()[1];
        return ans;
    }
}
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
    vector<pair<int,int>> v;
    for (int i = 0; i < (int)mat.size(); i++) {
        int c = 0; for (int x : mat[i]) c += x;
        v.push_back({c, i});
    }
    sort(v.begin(), v.end());
    vector<int> ans;
    for (int i = 0; i < k; i++) ans.push_back(v[i].second);
    return ans;
}
Time: O(m · n + m log k) Space: O(m)