• [LeetCode] 1329. Sort the Matrix Diagonally


    A matrix diagonal is a diagonal line of cells starting from some cell in either the topmost row or leftmost column and going in the bottom-right direction until reaching the matrix's end. For example, the matrix diagonal starting from mat[2][0], where mat is a 6 x 3 matrix, includes cells mat[2][0]mat[3][1], and mat[4][2].

    Given an m x n matrix mat of integers, sort each matrix diagonal in ascending order and return the resulting matrix.

    Example 1:

    Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
    Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]
    

    Example 2:

    Input: mat = [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
    Output: [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

    Constraints:

    • m == mat.length
    • n == mat[i].length
    • 1 <= m, n <= 100
    • 1 <= mat[i][j] <= 100

    将矩阵按对角线排序。

    矩阵对角线 是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat 有 6 行 3 列,从 mat[2][0] 开始的 矩阵对角线 将会经过 mat[2][0]、mat[3][1] 和 mat[4][2] 。

    给你一个 m * n 的整数矩阵 mat ,请你将同一条 矩阵对角线 上的元素按升序排序后,返回排好序的矩阵。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/sort-the-matrix-diagonally
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题题意很直观,难点在于代码如何确定同一条对角线上的点。我参考了Lee大神的帖子,这里他发现一个规律,就是同一条对角线上的点的横纵坐标 i - j 是相等的。根据这个发现,我们可以把横纵坐标 i - j 当做hashmap的key,然后把key相同的坐标值放入一个最小堆来完成排序。

    时间O(mnlogD) - D = Math.min(m, n)

    空间O(mn)

    Java实现

     1 class Solution {
     2     public int[][] diagonalSort(int[][] mat) {
     3         int m = mat.length;
     4         int n = mat[0].length;
     5         HashMap<Integer, PriorityQueue<Integer>> map = new HashMap<>();
     6         for (int i = 0; i < m; i++) {
     7             for (int j = 0; j < n; j++) {
     8                 map.putIfAbsent(i - j, new PriorityQueue<>());
     9                 map.get(i - j).offer(mat[i][j]);
    10             }
    11         }
    12 
    13         for (int i = 0; i < m; i++) {
    14             for (int j = 0; j < n; j++) {
    15                 mat[i][j] = map.get(i - j).poll();
    16             }
    17         }
    18         return mat;
    19     }
    20 }

    LeetCode 题目总结

  • 相关阅读:
    ios---图片缩放
    ios---清除缓存
    ReactNative---组件种类
    Linux 用户和用户组管理
    Linux 文件与目录管理
    linux文件的基本属性
    xshell 快速复制打开之前用过的ssh
    ll 和 ls -l的详解
    laravel rbac的用户 角色 权限的crud
    laravel 中的rbac自己简单的实现
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14615564.html
Copyright © 2020-2023  润新知