当前位置:   article > 正文

LeetCode - 1329 将矩阵按对角线排序【排序】

将矩阵按对角线排序

1329. 将矩阵按对角线排序

  1. 示例1
  2. 输入:mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
  3. 输出:[[1,1,1,1],[1,2,2,2],[1,2,3,3]]
  1. 示例2
  2. 输入: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]]
  3. 输出:[[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]]

提示:

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

思路

  题意:将二维数组按照对角线方向对其排序。

  方法:可以看到数据范围是[1,100],分布范围很小,可以使用计数排序。其次,对角线方向读取方法可以将整个二维数组分为上三角和下三角两个部分。设置起始偏移量k以及两个索引i和j,让i, j不断加1,直至到达边界。读取数据后存储至计数数组中,再从小到大读取数据填回原数组。

代码

  1. class Solution {
  2. public int[][] diagonalSort(int[][] mat) {
  3. for (int k = 0; k < mat.length; k++) {
  4. int i = 0;
  5. int j = 0;
  6. int[] nums = new int[101];
  7. while (i + k < mat.length && j < mat[0].length) {
  8. nums[mat[i+k][j]]++;
  9. i++;
  10. j++;
  11. }
  12. i = 0;
  13. j = 0;
  14. for (int l = 1; l <= 100; l++) {
  15. while (nums[l] != 0) {
  16. mat[i+k][j] = l;
  17. nums[l]--;
  18. i++;
  19. j++;
  20. }
  21. }
  22. }
  23. for (int k = 1; k < mat[0].length; k++) {
  24. int i = 0;
  25. int j = 0;
  26. int[] nums = new int[101];
  27. while (i < mat.length && j + k < mat[0].length) {
  28. nums[mat[i][j+k]]++;
  29. i++;
  30. j++;
  31. }
  32. i = 0;
  33. j = 0;
  34. for (int l = 1; l <= 100; l++) {
  35. while (nums[l] != 0) {
  36. mat[i][j+k] = l;
  37. nums[l]--;
  38. i++;
  39. j++;
  40. }
  41. }
  42. }
  43. return mat;
  44. }
  45. }

运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/530377
推荐阅读
相关标签
  

闽ICP备14008679号