LeetCode.1030-曼哈顿距离排序矩阵单元格(Matrix Cells in Distance Order)
这是小川的第384次更新,第412篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第246题(顺位题号是1030)。我们给出一个矩阵,其中R行和C列具有整数坐标(r,c)的单元格,其中0 <= r <R且0 <= 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)的曼哈顿距离来排序数组元素。对于排序,我们借助Arrays的sort方法,在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)的更多相关文章
- [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 & ...
- 【Leetcode_easy】1030. Matrix Cells in Distance Order
problem 1030. Matrix Cells in Distance Order 参考 1. Leetcode_easy_1030. Matrix Cells in Distance Orde ...
- 【LeetCode】1030. Matrix Cells in Distance Order 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcod ...
- leetcode- 距离顺序排序矩阵单元格
C++解法: #include <iostream> #include <vector> #include <map> #include <algorithm ...
- 【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 ...
- PyQt5单元格操作大全
1.显示二维列表数据(QTableView)控件 '''显示二维列表数据(QTableView)控件数据源model需要创建一个QTableView实例和一个数据源model,然后将其两者关联 MVC ...
- count、counta函数巧妙运用于合并单元格填充序号
函数运用: 1.COUNT(value1,value2, ...) value1 是必需参数. 要计算其中数字的个数的第一项.单元格引用或区域. value2, ... 为可选参数 ...
- Aspose.Cells 首次使用,用到模版填充数据,合并单元格,换行
Aspose.Cells 首次使用,用到模版填充数据,合并单元格,换行 模版格式,图格式是最简单的格式,但实际效果不是这种,实际效果图如图2 图2 ,注意看红色部分,一对一是正常的,但是有一对多的订单 ...
- Excel 2003 中如何用VBA 代码访问单元格里的值及操作单元格 - 唐诗宋词的专栏 - 博客频道 - CSDN.NET
在Excel 中编写VBA 代码,最常做的事可能就是操作表单中单元格里的数据. 我这里总结一下如何从VBA 代码中操作单元格的数据. 在VBA 代码中操作单元格需要用到Range 对象,Range 是 ...
随机推荐
- ORACLE纯SQL实现多行合并一行
项目中遇到一个需求,需要将多行合并为一行.表结构如下:NAME Null Type---------------------- ...
- head first 设计模式笔记9-迭代器模式
迭代器模式:提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露其内部的表示. 迭代器接口 /** * @author oy * @date 2019年9月22日 上午9:03:08 * @ver ...
- Java多线程和并发(一),进程与线程的区别
目录 1.进程和线程的由来 2.进程和线程的定义 3.进程和线程的区别 一.进程和线程的区别 1.进程和线程的由来 2.进程和线程的定义 进程是资源分配的最小单位,线程是CPU调度的最小单位 3.进程 ...
- 在对 Angular 的文档 aio 进行编译的时候提示错误
error angular-examples-master@1.0.0: The engine "yarn" is incompatible with this module. E ...
- #4 div1E Parentheses 括号匹配
E - Parentheses Time Limit:2000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Subm ...
- 关于多个py文件生成一个可运行exe文件(用pyinstaller)
首先下载Pyinstaller,在cmd命令下执行:pip installer Pyinstaller,不需要关心安装在哪 然后把所有相关的py文件都放在一个目录下 在那个目录下执行cmd命令:pyi ...
- python3笔记六:for语句
一:学习内容 for语句 二:for-in语句 1. 格式 for 变量名 in 集合: 语句 2.逻辑 按顺序取集合中的每个元素赋值给变量,再去执行语句,如此循环往复 3.举例 for i i ...
- 选题 Scrum立会报告+燃尽图 05
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8749 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 杨萍队名:胜 ...
- LeetCode 39. 组合总和(Combination Sum)
题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限 ...
- How to correctly use preventDefault(), stopPropagation(), or return false; on events
How to correctly use preventDefault(), stopPropagation(), or return false; on events I’m sure this h ...