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 是 ...
随机推荐
- js - 执行上下文和作用域以及闭包
首先,咱们通常被"执行上下文","执行上下文环境","上下文环境","执行上下文栈"这些名词搞混.那我们一一来揭秘这些名 ...
- sql 创建数据库并对数据库更改排序规则
use master -- 设置当前数据库为master,以便访问sysdatabases表 go if exists(select * from sysdatabases where name='t ...
- setAttribute()方法和 getAttribute() 方法
一.setAttribute() 方法 setAttribute() 方法为一个或一组元素添加指定的属性,并且为其赋指定的值.(主要针对自定义属性) 如果这个属性已经存在,仅仅设置或是修改属性值. 浏 ...
- CSS层定位——固定定位,相对定位,绝对定位
主要写关于层定位的相关知识 ㈠定位概述 ⑴像图像软件中的图层一样可以对每一个layer能够精确定位操作 ⑵层定位的position属性决定了当前的一个网页元素,可以叠加到另一个网页元素上面,那么我们把 ...
- html5 和h5的区别
html5 是公认的web开发的html规范,是一系列关于html的标准,它就好比是国家的法律,比如未成年不准进网吧,网吧要是允许未成年人进入,国家就要对网吧和未成年人进行处罚和教育.同样的,你写的h ...
- js中的“==”与“===”的区别
console(34 == "34") 输出true console(34 === "34") 输出false 因此,== 只判断值,不判断类型,实际上里 ...
- KMP模版 && KMP求子串在主串出现的次数模版
求取出现的次数 : #include<bits/stdc++.h> ; char mo[maxn], str[maxn];///mo为模式串.str为主串 int next[maxn]; ...
- Jmeter -- 添加断言,及断言结果
步骤: 1. 添加响应断言(添加-断言-响应断言) Add --> Assertions --> Response Assertion 2. 配置断言 判断响应内容中,是否包含关键字“禅 ...
- git梳理
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本地库管理命令 git init ...
- ZooKeeper java例子解读
转载链接:https://blog.csdn.net/liyiming2017/article/details/83276706 需求理解我们先回顾一下例子的需求,此客户端有如下四个需求: 1.它接收 ...