文章目录
1. 题目
2. 解题
1. 题目
给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。
每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。
单值网格 是全部元素都相等的网格。
返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1 。
输入:grid = [[2,4],[6,8]], x = 2 输出:4 解释:可以执行下述操作使所有元素都等于 4 : - 2 加 x 一次。 - 6 减 x 一次。 - 8 减 x 两次。 共计 4 次操作。
输入:grid = [[1,5],[2,3]], x = 1 输出:5 解释:可以使所有元素都等于 3 。
输入:grid = [[1,2],[3,4]], x = 2 输出:-1 解释:无法使所有元素相等。 提示: m == grid.length n == grid[i].length 1 <= m, n <= 10^5 1 <= m * n <= 10^5 1 <= x, grid[i][j] <= 10^4
2. 解题
- 每个数之间的差必须能被 x 整除
- 选择中位数作为最终的目标能使次数最少
class Solution { public: int minOperations(vector<vector<int>>& grid, int x) { int m = grid.size(), n = grid[0].size(), k = 0, a = grid[0][0]; vector<int> nums(m*n); for(int i = 0; i < m; ++i) { for(int j = 0; j < n; ++j) { nums[k++] = grid[i][j]; if((grid[i][j]-a)%x != 0) return -1; } } sort(nums.begin(), nums.end()); int target = nums[m*n/2], ct = 0; for(auto n : nums) ct += abs(n-target)/x; return ct; }
252 ms 76.4 MB C++