go语言LeetCode题解1030距离顺序排列矩阵单元格
作者:刘09k11 发布时间:2024-05-22 10:09:19
标签:go,排列矩阵,单元格,LeetCode
一 描述
1030. 距离顺序排列矩阵单元格 - 力扣(LeetCode) (leetcode-cn.com)
给定四个整数 row
, cols
, rCenter
和 cCenter
。有一个 rows x cols
的矩阵,你在单元格上的坐标是 (rCenter, cCenter)
。
返回矩阵中的所有单元格的坐标,并按与 (rCenter, cCenter)
的 距离 从最小到最大的顺序排。你可以按 任何 满足此条件的顺序返回答案。
单元格(r1, c1)
和 (r2, c2)
之间的距离为|r1 - r2| + |c1 - c2|
。
示例 1:
输入:rows = 1, cols = 2, rCenter = 0, cCenter = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]
示例 2:
输入:rows = 2, cols = 2, rCenter = 0, cCenter = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。
示例 3:
输入:rows = 2, cols = 3, rCenter = 1, cCenter = 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 <= rows, cols <= 100
0 <= rCenter < rows
0 <= cCenter < cols
二 分析
这个问题其实用任何排序都可以做, 不用那么暴力还把 (r0,c0) 周围的单元格全部遍历一遍
解题的关键在于定义好 less 函数, 相当于 Comparable 接口中的 compareTo 方法
步骤分为两步
构建一个二维数组
比较大小排序即可 我这里使用快速排序
三 答案
class Solution {
public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
int[][] a = new int[R * C][2];
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
a[i * C + j] = new int[]{i, j};
}
}
sort(a, 0, a.length - 1, r0, c0);
return a;
}
private static void sort(int[][] a, int lo, int hi, int r0, int c0) {
if (hi <= lo) {
return;
}
int j = partition(a, lo, hi, r0, c0);
sort(a, lo, j - 1, r0, c0);
sort(a, j + 1, hi, r0, c0);
}
private static int partition(int[][] a, int lo, int hi, int r0, int c0) {
int i = lo;
int j = hi + 1;
while (true) {
while (less(a, ++i, lo, r0, c0)) {
if (i >= hi) {
break;
}
}
while (less(a, lo, --j, r0, c0)) {
if (j <= lo) {
break;
}
}
if (i >= j) {
break;
}
swap(a, i, j);
}
swap(a, lo, j);
return j;
}
private static void swap(int[][] a, int i, int j) {
int[] tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
private static boolean less(int[][] a, int i, int j, int ro, int c0) {
int[] arr1 = a[i];
int[] arr2 = a[j];
int len1 = Math.abs(arr1[0] - ro) + Math.abs(arr1[1] - c0);
int len2 = Math.abs(arr2[0] - ro) + Math.abs(arr2[1] - c0);
return len1 - len2 < 0;
}
}
来源:https://juejin.cn/post/7181771721396092987


猜你喜欢
- 1. 初始化项目// ① npm i -g @vue/cli// ② vue create my-project// ③ npm insta
- Anaconda下需要使用Python与MySQL数据库进行交互,所以需要import一个mysql-python的包,但是在ipython
- 本文实例为大家分享了vue移动端左右滑动事件,供大家参考,具体内容如下<!DOCTYPE html><html> &
- 这篇文章主要介绍了Pytest mark使用实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 1、场景描述通常来说,前端要拿到excel数据,都是先上传存储数据库,然后再请求后端接口,获取数据。但有100个产品经理,就会有101个不同
- 使用 Windows 系统一大好处是它的应用太丰富了,甚至强大的 GPU 也能在闲暇时间做点其它「工作」。然而与 Linux 或 macOS
- 最近做了一个项目其中有项目需求涉及到访问控制,在访问需要登录才能使用的页面或功能时,会弹出登录框:效果如下: 图 1-点击用户名时,如未登录
- 前言对话框是很常用的组件 , 在很多地方都会用到,一般我们可以使用自带的alert来弹出对话框,但是假如是设计出的图该怎么办呢 ,所以我们需
- 背景想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名、联系方式、邮箱等基本信息,然后你的老板现在需要替换邀请
- 前言前几话主要讲解关于使用golang进行单元测试,在单元测试的上一层就是接口测试,本节主要讲使用golang进行接口测试,其中主要以htt
- 概述Go 的并发模型与其他语言不同,虽说它简化了并发程序的开发难度,但如果不了解使用方法,常常会遇到 goroutine 泄露的问题。虽然
- 本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下话不多说,直接上代码:全部工程文件,在GitHub:五子棋
- 1.安装插件步骤2.点击OK确认之后,提示IDE需要重启,选择重启:3.设置leetcode插件,用户名、密码:4.点击右下角的leetco
- 前些年,HandlerSocket的横空出世让人们眼前一亮,当时我还写了一篇文章介绍了其用法梗概,时至今日,由于种种原因,HandlerSo
- 1、前言在Python中元组是一个和列表非常类似的数据类型,不同之处就是列表中的元素可以修改,而元组之中的元素不可以修改。2、定义和使用元组
- jetbrains IDE的插件加载不出来场景Win10、IDEA 2020.2、电脑配置了HTTP/HTTPS/socks梯子代理。想要给
- root账户为MySQL的超级管理员用户,拥有MySQL提供的所有权限。我们登录了root账户可以重置其它创建的所有用户的密码,那么root
- 我们在升级系统的时候,经常碰到需要更新服务器端数据结构等操作,之前的方式是通过手工编写alter sql脚本处理,经常会发现遗漏,导致程序发
- 在我供职的公司不仅仅拥有Oracle数据库,同时还拥有SQL Server数据库,所以我经常遇见人们向我提两种问题。 第一种通常都是以&qu
- 栅格系统的形成1692年,新登基的法国国王路易十四感到法国的印刷水平强差人意,因此命令成立一个管理印刷的皇家特别委员会。他们的首要任务是设计