算法提升——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

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为