Best Meeting Point

hard math median matrix

Problem

Given an m×n grid where 1 marks a home, find the point where the total Manhattan distance from every home is minimized.

Inputgrid = [[1,0,0,0,1],[0,0,0,0,0],[0,0,1,0,0]]
Output6
Median row = 0, median col = 2 — total |0-0|+|0-0|+|2-0|+|0-2|+|0-2|+|2-2|=6.

def min_total_distance(grid):
    rows, cols = [], []
    for r, row in enumerate(grid):
        for c, v in enumerate(row):
            if v == 1:
                rows.append(r); cols.append(c)
    cols.sort()
    mr, mc = rows[len(rows)//2], cols[len(cols)//2]
    return sum(abs(r - mr) for r in rows) + sum(abs(c - mc) for c in cols)
function minTotalDistance(grid) {
  const rows = [], cols = [];
  for (let r = 0; r < grid.length; r++)
    for (let c = 0; c < grid[0].length; c++)
      if (grid[r][c] === 1) { rows.push(r); cols.push(c); }
  cols.sort((a, b) => a - b);
  const mr = rows[Math.floor(rows.length / 2)];
  const mc = cols[Math.floor(cols.length / 2)];
  let total = 0;
  rows.forEach(r => total += Math.abs(r - mr));
  cols.forEach(c => total += Math.abs(c - mc));
  return total;
}
class Solution {
    public int minTotalDistance(int[][] grid) {
        List rows = new ArrayList<>(), cols = new ArrayList<>();
        for (int r = 0; r < grid.length; r++)
            for (int c = 0; c < grid[0].length; c++)
                if (grid[r][c] == 1) { rows.add(r); cols.add(c); }
        Collections.sort(cols);
        int mr = rows.get(rows.size() / 2);
        int mc = cols.get(cols.size() / 2);
        int total = 0;
        for (int r : rows) total += Math.abs(r - mr);
        for (int c : cols) total += Math.abs(c - mc);
        return total;
    }
}
int minTotalDistance(vector>& grid) {
    vector rows, cols;
    for (int r = 0; r < (int)grid.size(); r++)
        for (int c = 0; c < (int)grid[0].size(); c++)
            if (grid[r][c] == 1) { rows.push_back(r); cols.push_back(c); }
    sort(cols.begin(), cols.end());
    int mr = rows[rows.size() / 2], mc = cols[cols.size() / 2];
    int total = 0;
    for (int r : rows) total += abs(r - mr);
    for (int c : cols) total += abs(c - mc);
    return total;
}
Time: O(mn) Space: O(mn)