当前位置: 首页 > news >正文

LeetCode——3143. 正方形中的最多点数

通过万岁!!!

  • 题目:给你一个n*2的数组,然后第i行表示第i个点的坐标,然后还给你了一个字符串s,s[i]则表示第i个点的名称。然后让你找一个中心是(0,0)的正方形,正方形中尽可能包含多的点,但是里面的点的名称不能重复。即所有的点不存在s[i]=s[j]的情况。
  • 思路:下面的点我们先都以第一象限来考虑,然后写代码的时候加个绝对值就好了。首先是构建一个map,然后key是名称,value是点的list。如果list的长度大于1,就对list进行排序,排序的规则就是坐标轴(x或者y)最大的那个点在后面,即切比雪夫距离,也就是max(|x|,|y|)。然后我们找正方形边长的一半(这里叫他minWidth)就好了,因为这个list的长度大于1,我们要让正方形尽可能的大,list是排序过的,所以不包含第二点(暂记为(a,b))就好了,也就是minWidth=max(a,b)-1,但是minWidth还要与之前的minWidth取最小值,所以最终公式为minWidth=max(minWidth,max(a,b)-1)。拿到宽度以后我们再遍历map,然后记录有多少个点再minWidth的范围之内就好了。
  • 进阶思路:我的代码时间复杂度有点高,因为涉及到了排序。然后我看了下网上大佬们的思路,其实不用排序的,我们只需要遍历字符串,找到s[i]的这些点中,第二小的切比雪夫距离。
  • 技巧:排序

java代码

class Solution {public int maxPointsInsideSquare(int[][] points, String s) {Map<Character, List<int[]>> map = new HashMap<>();for (int i = 0; i < s.length(); i++) {List<int[]> list = map.getOrDefault(s.charAt(i), new ArrayList<>());list.add(points[i]);map.put(s.charAt(i), list);}// 对list进行排序int minWidth = Integer.MAX_VALUE;for (Map.Entry<Character, List<int[]>> entry : map.entrySet()) {List<int[]> value = entry.getValue();if (value.size() >= 2) {// 坐标最大的那个放在后面value.sort(Comparator.comparingInt(o -> Math.max(Math.abs(o[0]), Math.abs(o[1]))));// 获取第二个点int[] point = value.get(1);// 不能包含第二个点minWidth = Math.min(minWidth, Math.max(Math.abs(point[0]), Math.abs(point[1])) - 1);}}int ret = 0;for (Map.Entry<Character, List<int[]>> entry : map.entrySet()) {List<int[]> value = entry.getValue();int[] point = value.getFirst();if (Math.abs(point[0]) <= minWidth && Math.abs(point[1]) <= minWidth) {ret++;}}return ret;}
}

java代码——进阶

class Solution {public int maxPointsInsideSquare(int[][] points, String s) {Map<Character, Integer> map = new HashMap<>();// 正方形的宽度的一半int minWidth = Integer.MAX_VALUE;for (int i = 0; i < s.length(); i++) {int temp = Math.max(Math.abs(points[i][0]), Math.abs(points[i][1]));// s[i]的宽度Integer siWidth = map.getOrDefault(s.charAt(i), Integer.MAX_VALUE);if (temp < siWidth) {// 因为已经有比siWidth小的点了,siWidth可能是第二小的点minWidth = Math.min(minWidth, siWidth);// 当前这个点的坐标会更小,我们要保留这个点map.put(s.charAt(i), temp);} else if (temp < minWidth) {// temp这个可能是不是s[i]中更小的,但是他比minWidth小minWidth = temp;}}int ret = 0;for (Map.Entry<Character, Integer> entry : map.entrySet()) {if (entry.getValue() < minWidth) {ret++;}}return ret;}
}
  • 总结:题目还是有点难度的,主要是这里的切比雪夫距离。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt Creator卡顿
  • python开发上位机 - PyCharm环境搭建、安装PyQt5及工具
  • k8s中yaml文件的编写
  • mysql 监控开始时间,结束时间,平均取n个时间点
  • Android 14适配记录
  • 智能爬虫ScrapeGraphAI尝鲜
  • Linux Shell编程--脚本运行与变量置换
  • C++ 重要特性探究
  • Java二十三种设计模式-享元模式(12/23)
  • vue3实现商品图片放大镜效果(芋道源码yudao-cloud 二开笔记)
  • Jmeter--http信息头管理器的使用(转载)
  • GESP 一级 比赛
  • C# Unity 面向对象补全计划 七大原则 之 开闭原则(OCP) 难度:☆ 总结:已经写好的就别动它了,多用继承
  • elementPlus中el-table的每列两行溢出隐藏怎么设置
  • PPT免费图片素材网站分享
  • 77. Combinations
  • CSS 专业技巧
  • CSS中外联样式表代表的含义
  • flutter的key在widget list的作用以及必要性
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Swoft 源码剖析 - 代码自动更新机制
  • Theano - 导数
  • 基于web的全景—— Pannellum小试
  • 聊聊redis的数据结构的应用
  • 前端相关框架总和
  • 时间复杂度与空间复杂度分析
  • 详解NodeJs流之一
  • 延迟脚本的方式
  • 终端用户监控:真实用户监控还是模拟监控?
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​​​【收录 Hello 算法】9.4 小结
  • # 达梦数据库知识点
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #define、const、typedef的差别
  • #大学#套接字
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (二)hibernate配置管理
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (含笔试题)深度解析数据在内存中的存储
  • (转)ABI是什么
  • .net Application的目录
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET单元测试
  • .NET多线程执行函数
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .py文件应该怎样打开?
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国