2033. 获取单值网格的最小操作数 - 力扣(LeetCode)
2033. 获取单值网格的最小操作数 - 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。 单值网格 是全部元素都相等的网格。 返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1 。 示例 1: [https://assets.leetcode.com/uploads/2021/09/21/gridtxt.png] 输入:grid = [[2,4],[6,8]], x =...
思路
- 位置顺序无关,所以可以转换为一维数组排序解答。
排序后结果可用这个表达式表示:
(m-x[1])+(m-x[2])+……+(x[s-2]-m)+(x[s-1]-m) - 选择中位数可以使以上表达式的值最小,而且选择数组中没有的数并不会让结果更优。
代码
class Solution {
public int minOperations(int[][] grid, int x) {
int m = grid.length;
int n = grid[0].length;
int[] nums = new int[m * n];
// 公共的余数
int mod = grid[0][0] % x;
// 将二维数组转为一维数组,方便偏序
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 余数不同,说明无法满足条件
if (grid[i][j] % x != mod) {
return -1;
}
nums[i * n + j] = grid[i][j];
}
}
// 排序后找到中位数
Arrays.sort(nums);
int mid = nums[nums.length >> 1];
// 累加操作次数
int ans = 0;
for (int num : nums) {
ans += Math.abs(num - mid) / x;
}
return ans;
}
}
PS
另外汇报下为什么一周没答题,因为电脑送修了 ![]()
其他不说,鸡哥的售后服务还是很不错的,保修后半小时不到就有顺丰小哥上门取件,整体也挺快的。
问了下维修的工程师,原因说是小板短路,难道是因为积灰太多了?
1 个帖子 - 1 位参与者