程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(3)

距离顺序排列矩阵单元格

发布于2020-11-19 20:52     阅读(603)     评论(0)     点赞(28)     收藏(2)


给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。

另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。

返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)

 

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

我认为自己写的这个更容易明白其中的道理,性能上应该差不多,所以就自己可贴出来分享一下,也可以先看这一部分代码,然后再去看官方的答案,有助于理解

  1. public static int[][] allCellsDistOrder4(int R, int C, int r0, int c0) {
  2. int[][] ret = new int[R * C][];
  3. int index = 0;
  4. //添加第一个元素
  5. ret[index++] = new int[]{r0, c0};
  6. //确认一个最远距离,有多远就需要生成多少个正方形
  7. int maxDistance = Math.max(r0, R - 1 - r0) + Math.max(c0, C - 1 - c0);
  8. for (int distance = 1; distance <= maxDistance; distance++) {
  9. //由{row,c0}作为起点,正方形的四个顶点落在由row=r0,col = c0 组成的轴上
  10. int moveRow = r0 - distance;
  11. int moveCol = c0;
  12. //一共四条边
  13. //第一条边,右上
  14. while (true) {
  15. if (moveRow >= 0 && moveRow < R && moveCol >= 0 && moveCol < C) {
  16. ret[index++] = new int[]{moveRow, moveCol};
  17. }
  18. moveRow = moveRow + 1;
  19. moveCol = moveCol + 1;
  20. if (moveRow == r0) {
  21. break;
  22. }
  23. }
  24. //第二条边,左上
  25. while (true) {
  26. if (moveRow >= 0 && moveRow < R && moveCol >= 0 && moveCol < C) {
  27. ret[index++] = new int[]{moveRow, moveCol};
  28. }
  29. moveRow = moveRow + 1;
  30. moveCol = moveCol - 1;
  31. if (moveCol == c0) {
  32. break;
  33. }
  34. }
  35. //第三条边,左下
  36. while (true) {
  37. if (moveRow >= 0 && moveRow < R && moveCol >= 0 && moveCol < C) {
  38. ret[index++] = new int[]{moveRow, moveCol};
  39. }
  40. moveRow = moveRow - 1;
  41. moveCol = moveCol - 1;
  42. if (moveRow == r0) {
  43. break;
  44. }
  45. }
  46. //第四条边,右下
  47. while (true) {
  48. if (moveRow >= 0 && moveRow < R && moveCol >= 0 && moveCol < C) {
  49. ret[index++] = new int[]{moveRow, moveCol};
  50. }
  51. moveRow = moveRow - 1;
  52. moveCol = moveCol + 1;
  53. if (moveCol == c0) {
  54. break;
  55. }
  56. }
  57. }
  58. return ret;
  59. }

这个是力扣给的答案,看了半天才明白在说什么:

  1. public static int[][] allCellsDistOrder3(int R, int C, int r0, int c0) {
  2. int[] dr = {1, 1, -1, -1};
  3. int[] dc = {1, -1, -1, 1};
  4. //到四个顶点的最大距离
  5. int maxDist = Math.max(r0, R - 1 - r0) + Math.max(c0, C - 1 - c0);
  6. int[][] ret = new int[R * C][];
  7. //起始点座标
  8. int row = r0, col = c0;
  9. int index = 0;
  10. //添加起始点
  11. ret[index++] = new int[]{row, col};
  12. for (int dist = 1; dist <= maxDist; dist++) {
  13. //行减一
  14. row--;
  15. //取得四个点,每一次循环完毕,还会回到起始点,方便row再一次减减
  16. for (int i = 0; i < 4; i++) {
  17. //i确定一条边,直到遇到下一个端点时停止(数组与i共同确定了边的走向)
  18. //如果i是2的整数倍,且跟原点不在同一行
  19. //如果i不是2的整数倍,且跟原点不在同一列
  20. while ((i % 2 == 0 && row != r0) || (i % 2 != 0 && col != c0)) {
  21. //如果行大于0,且行小于最大值,且列大于0,且列小于最大值
  22. if (row >= 0 && row < R && col >= 0 && col < C) {
  23. //返回值赋值为当前结点
  24. ret[index++] = new int[]{row, col};
  25. }
  26. //在这条边上,运动方向是同向的(只朝一个方向)
  27. row += dr[i];
  28. col += dc[i];
  29. }
  30. }
  31. }
  32. return ret;
  33. }

 



所属网站分类: 技术文章 > 博客

作者:javagogogo

链接:http://www.javaheidong.com/blog/article/1042/688b6434cd2414743641/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)