文章目录
- 1. 题目
- 2. 解题
1. 题目
给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。
每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。
单值网格 是全部元素都相等的网格。
返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1 。
示例 1:
输入:grid = [[2,4],[6,8]], x = 2
输出:4
解释:可以执行下述操作使所有元素都等于 4 :
- 2 加 x 一次。
- 6 减 x 一次。
- 8 减 x 两次。
共计 4 次操作。
示例 2:
输入:grid = [[1,5],[2,3]], x = 1
输出:5
解释:可以使所有元素都等于 3 。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-operations-to-make-a-uni-value-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!