Leetcode每日一题 —— 2033. 获取单值网格的最小操作数

力扣 LeetCode 2033. 获取单值网格的最小操作数 - 力扣(LeetCode) 2033. 获取单值网格的最小操作数 - 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。 单值网格 是全部元素都相...
Leetcode每日一题 —— 2033. 获取单值网格的最小操作数
Leetcode每日一题 —— 2033. 获取单值网格的最小操作数
力扣 LeetCode

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 =...

思路

  1. 位置顺序无关,所以可以转换为一维数组排序解答。
    排序后结果可用这个表达式表示:
    (m-x[1])+(m-x[2])+……+(x[s-2]-m)+(x[s-1]-m)
  2. 选择中位数可以使以上表达式的值最小,而且选择数组中没有的数并不会让结果更优。

代码

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
另外汇报下为什么一周没答题,因为电脑送修了 :rofl:
其他不说,鸡哥的售后服务还是很不错的,保修后半小时不到就有顺丰小哥上门取件,整体也挺快的。
问了下维修的工程师,原因说是小板短路,难道是因为积灰太多了?

262adc208fc9db2f56a76ca4266c66d

1 个帖子 - 1 位参与者

阅读完整话题

来源: linux.do查看原文