Skip to content

LeetCode 每日一题笔记

0. 前言

  • 日期:2025.03.20
  • 题目:3567.子矩阵的最小绝对差
  • 难度:中等
  • 标签:数组 矩阵 排序

1. 题目理解

问题描述
给你一个 m x n 的整数矩阵 grid 和一个整数 k。

对于矩阵 grid 中的每个连续的 k x k 子矩阵,计算其中任意两个 不同值 之间的 最小绝对差 。

返回一个大小为 (m - k + 1) x (n - k + 1) 的二维数组 ans,其中 ans[i][j] 表示以 grid 中坐标 (i, j) 为左上角的子矩阵的最小绝对差。

注意:如果子矩阵中的所有元素都相同,则答案为 0。

子矩阵 (x1, y1, x2, y2) 是一个由选择矩阵中所有满足 x1 <= x <= x2 且 y1 <= y <= y2 的单元格 matrix[x][y] 组成的矩阵。

示例

输入: grid = [[1,8],[3,-2]], k = 2 输出: [[2]] 解释: 只有一个可能的 k x k 子矩阵:[[1, 8], [3, -2]]。 子矩阵中的不同值为 [1, 8, 3, -2]。 子矩阵中的最小绝对差为 |1 - 3| = 2。因此,答案为 [[2]]。

2. 解题思路

核心观察

算法步骤

3. 代码实现

java

package com.sheeta1998.lec.lc3567;

import java.util.Arrays;

public class lc3600_lc3699.lc3660.Solution {
    public int[][] minAbsDiff(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] ans = new int[m + 1 - k][n + 1 - k];
        for (int i = 0; i < m + 1 - k; i++) {
            for (int j = 0; j < n + 1 - k; j++) {
                int res = Integer.MAX_VALUE;
                int[] ints = new int[k * k];
                int count = 0;
                for (int l = i; l < k + i; l++) {
                    for (int o = j; o < k + j; o++) {
                        ints[count++] = grid[l][o];
                    }
                }
                int[] sortedInts = Arrays.stream(ints).sorted().toArray();
                if (k == 1) {
                    res = 0;
                } else {
                    for (int l = 1; l < k * k; l++) {
                        if (sortedInts[l - 1] != sortedInts[l]) {
                            res = Math.min(res, Math.abs(sortedInts[l] - sortedInts[l-1]));
                        }
                    }
                }
                if (res == Integer.MAX_VALUE) {
                    res = 0;
                }
                ans[i][j] = res;
            }
        }
        return ans;
    }

}

4. 代码优化说明

5. 复杂度分析

6. 总结

Powered by VitePress 1.6.4 | 持续更新中