这是小川的第384次更新,第412篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第246题(顺位题号是1030)。我们给出一个矩阵,其中R行和C列具有整数坐标(r,c)的单元格,其中0 <= r <R0 <= c <C

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

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

例如:

输入:R = 1,C = 2,r0 = 0,c0 = 0

输出:[[0,0],[0,1]]

说明:从(r0,c0)到其他单元格的距离为:[0,1]

输入:R = 2,C = 2,r0 = 0,c0 = 1

输出:[[0,1],[0,0],[1,1],[1,0]]

说明:从(r0,c0)到其他单元格的距离为:[0,1,1,2]。答案[[0,1],[1,1],[0,0],[1,0]]也将被接受为正确。

输入:R = 2,C = 3,r0 = 1,c0 = 2

输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]

说明:从(r0,c0)到其他单元格的距离为:[0,1,1,2,2,3]。还有其他答案也被认为是正确的,例如[[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]

注意

  • 1 <= R <= 100

  • 1 <= C <= 100

  • 0 <= r0 <R

  • 0 <= c0 <C

02 第一种解法

题目的意思是根据给定范围的R和C组成一个二维数组,算出所有(r,c)(r0,c0)的曼哈顿距离,根据曼哈顿距离的大小来排序二维数组里面的元素。

因此,我们只需要做两件事情,先将二维数组中的元素初始化好,再根据每个元素到到(r0,c0)的曼哈顿距离来排序数组元素。对于排序,我们借助Arrayssort方法,在sort方法第二个参数里,实现Comparator接口,重写其compare方法,排序规则依据两点的曼哈顿距离大小来定,最后输出排序后的数组即可。

public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
int[][] matrix = new int[R*C][2];
int index = 0;
for (int i=0; i<R; i++) {
for (int j=0; j<C; j++) {
matrix[index][0] = i;
matrix[index][1] = j;
index++;
}
}
Arrays.sort(matrix, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
int distance = Math.abs(a[0]-r0)+Math.abs(a[1]-c0);
int distance2 = Math.abs(b[0]-r0)+Math.abs(b[1]-c0);
return distance - distance2;
}
});
return matrix;
}

03 第二种解法

思路和第一种解法一样,只是将排序算法优化了,时间复杂度变成了O(N),其中N代表R*C,使用的是计数排序算法,但是这里用到的排序算法和我们之前使用过的排序算法稍有不同,属于进阶版,本周会抽时间单独写一篇介绍计数排序算法的文章,这里就不展开细讲了。

public int[][] allCellsDistOrder2(int R, int C, int r0, int c0) {
int[][] matrix = new int[R*C][2];
int[] count = new int[R + C];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
int dis = Math.abs(i - r0) + Math.abs(j - c0);
count[dis + 1]++;
}
}
for (int i = 1; i < count.length; i++) {
count[i] += count[i - 1];
}
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
int dis = Math.abs(r - r0) + Math.abs(c - c0);
matrix[count[dis]] = new int[] {r, c};
count[dis]++;
}
}
return matrix;
}

04 小结

算法专题目前已连续日更超过七个月,算法题文章252+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.1030-曼哈顿距离排序矩阵单元格(Matrix Cells in Distance Order)的更多相关文章

  1. [Swift]LeetCode1030. 距离顺序排列矩阵单元格 | Matrix Cells in Distance Order

    We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), where 0 & ...

  2. 【Leetcode_easy】1030. Matrix Cells in Distance Order

    problem 1030. Matrix Cells in Distance Order 参考 1. Leetcode_easy_1030. Matrix Cells in Distance Orde ...

  3. 【LeetCode】1030. Matrix Cells in Distance Order 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcod ...

  4. leetcode- 距离顺序排序矩阵单元格

    C++解法: #include <iostream> #include <vector> #include <map> #include <algorithm ...

  5. 【leetcode】1030. Matrix Cells in Distance Order

    题目如下: We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), whe ...

  6. PyQt5单元格操作大全

    1.显示二维列表数据(QTableView)控件 '''显示二维列表数据(QTableView)控件数据源model需要创建一个QTableView实例和一个数据源model,然后将其两者关联 MVC ...

  7. count、counta函数巧妙运用于合并单元格填充序号

    函数运用: 1.COUNT(value1,value2, ...)      value1 是必需参数. 要计算其中数字的个数的第一项.单元格引用或区域.      value2, ... 为可选参数 ...

  8. Aspose.Cells 首次使用,用到模版填充数据,合并单元格,换行

    Aspose.Cells 首次使用,用到模版填充数据,合并单元格,换行 模版格式,图格式是最简单的格式,但实际效果不是这种,实际效果图如图2 图2 ,注意看红色部分,一对一是正常的,但是有一对多的订单 ...

  9. Excel 2003 中如何用VBA 代码访问单元格里的值及操作单元格 - 唐诗宋词的专栏 - 博客频道 - CSDN.NET

    在Excel 中编写VBA 代码,最常做的事可能就是操作表单中单元格里的数据. 我这里总结一下如何从VBA 代码中操作单元格的数据. 在VBA 代码中操作单元格需要用到Range 对象,Range 是 ...

随机推荐

  1. windows下前端开发环境配置

    nvm安装 多媒体布局 前端自动化构建工具,gulp nvm管理node的版本,npm是node的包管理工具 下载nvm安装包 https://github.com/coreybutler/nvm-w ...

  2. tomcat9.0 问题汇总

    安装时提示 Failed installing tomcat9 service 是因为之前安装tomcat,然后直接删除文件夹,虽然把文件夹删除了,但是重新安装时,服务存在相同的服务名,解决办法:使用 ...

  3. 动软代码生成器生成model

    model <#@ template language="c#" HostSpecific="True" #> <#@ output exte ...

  4. Word:转换PDF

    本文适用于Word 2007 + Windows 7,造冰箱的大熊猫@cnblogs 2018/8/3 一.Word文档转PDF文档 把Word文档转换为PDF,有两个免费解决方案 1.Microso ...

  5. codevs 2602 最短路径问题x

                         题目描述 Description 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间.其中的一些点之间有连线.若有连线,则表示 ...

  6. sklearn pca降维

    PCA降维 一.原理 这篇文章总结的不错PCA的数学原理. PCA主成分分析是将原始数据以线性形式映射到维度互不相关的子空间.主要就是寻找方差最大的不相关维度.数据的最大方差给出了数据的最重要信息. ...

  7. unittest详解(一) unittest初识

    unittest是python内置的一个单元测试框架,在学习怎么使用它之前,我们先来了解它的一些概念和原理. Test Case:测试用例,一个TestCase的实例就是一个测试用例.什么是测试用例呢 ...

  8. ID生成 雪花算法

    /** * ID生成 雪花算法 */ public class SnowFlake { public static SnowFlake getInstance() { return Singleton ...

  9. HDU 4725 The Shortest Path in Nya Graph (最短路 )

    This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just ...

  10. numpy中双冒号的作用

    import numpy as np a = np.array([[1, 2, 3, 1, 3, 5], [4, 5, 6, 2, 4, 3]]) print('a') print(a) print( ...