算法提升——LeetCode123场双周赛总结

2024-02-07 04:04

本文主要是介绍算法提升——LeetCode123场双周赛总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

周赛题目

三角形类型 II

给你一个下标从0开始长度为3的整数数组nums,需要用它们来构造三角形。

如果一个三角形的所有边长度相等,那么这个三角形称为equilateral。

如果一个三角形恰好有两条边长度相等,那么这个三角形称为isosceles。

如果一个三角形三条边的长度互不相同,那么这个三角形称为scalene。

如果这个数组无法构成一个三角形,请你返回字符串"none",否则返回一个字符串表示这个三角形的类型。

解题思路

本题是一道简单题,只要是连接构成三角形的要素是任意两边之和大于第三边即可。

class Solution {public String triangleType(int[] nums) {int a=nums[0];int b=nums[1];int c=nums[2];if (a+b<=c||a+c<=b||b+c<=a){return "none";}if (a==b&&b==c){return "equilateral";}if (a==b||b==c||a==c){return "isosceles";}return "scalene";}
}

人员站位的方案数 I

给你一个nx2的二维数组points,它表示二维平面上的一些点坐标,其中points[i]=[xi,yi]。

我们定义x轴的正方向为右(x轴递增的方向),x轴的负方向为左(x轴递减的方向)。类似的,我们定义y轴的正方向为上(y轴递增的方向),y轴的负方向为下(y轴递减的方向)。

你需要安排这n个人的站位,这n个人中包括liupengsay和小羊肖恩。你需要确保每个点处恰好有一个人。同时,liupengsay想跟小羊肖恩单独玩耍,所以liupengsay会以liupengsay的坐标为左上角,小羊肖恩的坐标为右下角建立一个矩形的围栏(注意,围栏可能不包含任何区域,也就是说围栏可能是一条线段)。如果围栏的内部或者边缘上有任何其他人,liupengsay都会难过。

请你在确保liupengsay不会难过的前提下,返回liupengsay和小羊肖恩可以选择的点对数目。

注意,liupengsay建立的围栏必须确保liupengsay的位置是矩形的左上角,小羊肖恩的位置是矩形的右下角。比方说,以(1,1),(1,3),(3,1)和(3,3)为矩形的四个角,给定下图的两个输入,liupengsay都不能建立围栏,原因如下:

图一中,liupengsay在(3,3)且小羊肖恩在(1,1),liupengsay的位置不是左上角且小羊肖恩的位置不是右下角。
图二中,liupengsay在(1,3)且小羊肖恩在(1,1),小羊肖恩的位置不是在围栏的右下角。
在这里插入图片描述

解题思路

先排序,按横坐标从小到大排序,横坐标相同时,按纵坐标从大到小排序。

这样在枚举points[i]和points[j]时(i<j),就只需要关心纵坐标的大小。

固定points[i[,然后枚举points[j],如果points[j][1]比之前枚举的纵坐标都打,那么矩形中没有其他的点,答案加一。否则不满足。

class Solution {public int numberOfPairs(int[][] points) {Arrays.sort(points, (p, q) -> p[0] != q[0] ? p[0] - q[0] : q[1] - p[1]);int ans = 0;for (int i = 0; i < points.length; i++) {int y0 = points[i][1];int maxY = Integer.MIN_VALUE;for (int j = i + 1; j < points.length; j++) {int y = points[j][1];if (y <= y0 && y > maxY) {maxY = y;ans++;}}}return ans;}}

最大好子数组和

给你一个长度为n的数组nums和一个正整数k。

如果nums的一个子数组中,第一个元素和最后一个元素差的绝对值恰好为k,我们称这个子数组为好的。换句话说,如果子数组nums[i…j]满足|nums[i]-nums[j]|==k,那么它是一个好子数组。

请你返回nums中好子数组的最大和,如果没有好子数组,返回0。

解题思路

利用前缀和来解决本题。子数组nums[i…j]的元素和为sum[j+1]-sum[i]

枚举j,找到最小的s[i],满足nums[i]-nums[j]==k。

class Solution {public static long maximumSubarraySum(int[] nums, int k) {int n = nums.length;long[] pre = new long[n + 1];for (int i = 0; i < n; i++) {pre[i + 1] = pre[i] + nums[i];}long ans = Long.MIN_VALUE;Map<Integer, Integer> index = new HashMap<>();for (int i = 0; i < n; i++) {int x = nums[i];int last1 = k + x;int last2 = x - k;if (index.containsKey(last1)) {int idx = index.get(last1);ans = Math.max(ans, pre[i+1] - pre[idx]);}if (index.containsKey(last2)) {int idx = index.get(last2);ans = Math.max(ans, pre[i+1] - pre[idx]);}if (index.containsKey(x)) {int idx = index.get(x);long seg = pre[i] - pre[idx];if (seg <= 0) {index.put(x, i);}} else {index.put(x, i); }}return ans == Long.MIN_VALUE ? 0 : ans;}
}

人员站位的方案数 II

给你一个nx2的二维数组points,它表示二维平面上的一些点坐标,其中points[i]=[xi,yi]。

我们定义x轴的正方向为右(x轴递增的方向),x轴的负方向为左(x轴递减的方向)。类似的,我们定义y轴的正方向为上(y轴递增的方向),y轴的负方向为下(y轴递减的方向)。

你需要安排这n个人的站位,这n个人中包括liupengsay和小羊肖恩。你需要确保每个点处恰好有一个人。同时,liupengsay想跟小羊肖恩单独玩耍,所以liupengsay会以liupengsay的坐标为左上角,小羊肖恩的坐标为右下角建立一个矩形的围栏(注意,围栏可能不包含任何区域,也就是说围栏可能是一条线段)。如果围栏的内部或者边缘上有任何其他人,liupengsay都会难过。

请你在确保liupengsay不会难过的前提下,返回liupengsay和小羊肖恩可以选择的点对数目。

注意,liupengsay建立的围栏必须确保liupengsay的位置是矩形的左上角,小羊肖恩的位置是矩形的右下角。比方说,以(1,1),(1,3),(3,1)和(3,3)为矩形的四个角,给定下图的两个输入,liupengsay都不能建立围栏,原因如下:

图一中,liupengsay在(3,3)且小羊肖恩在(1,1),liupengsay的位置不是左上角且小羊肖恩的位置不是右下角。
图二中,liupengsay在(1,3)且小羊肖恩在(1,1),小羊肖恩的位置不是在围栏的右下角。
在这里插入图片描述

解题思路

同第二道题。

总结

本次周赛中提到了一个前缀和的解法,后续需要实际在LeetCode中熟悉该算法,并输出一片学习文章。

这篇关于算法提升——LeetCode123场双周赛总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686462

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义