Minimum Operations to Make a Uni-Value Grid

medium array math sorting median

Problem

You are given an m × n integer grid and an integer x. In one operation you may add x to or subtract x from any single element. Return the minimum number of operations needed to make every element equal, or -1 if it is impossible.

Inputgrid = [[2,4],[6,8]], x = 2
Output4
Make every value 6: +x on 2 twice, −x on 8 once, 4→6 once = 4 operations.
Inputgrid = [[1,2],[3,4]], x = 2
Output-1
1 and 2 differ by 1, not a multiple of x = 2, so they can never meet.

def min_operations(grid, x):
    nums = sorted(v for row in grid for v in row)
    rem = nums[0] % x
    for v in nums:
        if v % x != rem:
            return -1
    median = nums[len(nums) // 2]
    ops = 0
    for v in nums:
        ops += abs(v - median) // x
    return ops
function minOperations(grid, x) {
  const nums = grid.flat().sort((a, b) => a - b);
  const rem = nums[0] % x;
  for (const v of nums) {
    if (v % x !== rem) return -1;
  }
  const median = nums[Math.floor(nums.length / 2)];
  let ops = 0;
  for (const v of nums) {
    ops += Math.abs(v - median) / x;
  }
  return ops;
}
int minOperations(int[][] grid, int x) {
    int m = grid.length, n = grid[0].length;
    int[] nums = new int[m * n];
    int k = 0;
    for (int[] row : grid) for (int v : row) nums[k++] = v;
    Arrays.sort(nums);
    int rem = nums[0] % x;
    for (int v : nums) if (v % x != rem) return -1;
    int median = nums[nums.length / 2];
    int ops = 0;
    for (int v : nums) ops += Math.abs(v - median) / x;
    return ops;
}
int minOperations(vector<vector<int>>& grid, int x) {
    vector<int> nums;
    for (auto& row : grid) for (int v : row) nums.push_back(v);
    sort(nums.begin(), nums.end());
    int rem = nums[0] % x;
    for (int v : nums) if (v % x != rem) return -1;
    int median = nums[nums.size() / 2];
    int ops = 0;
    for (int v : nums) ops += abs(v - median) / x;
    return ops;
}
Time: O(mn · log(mn)) Space: O(mn)