力扣 第 123 场双周赛 解题报告 | 珂学家 | 二维偏序+单调队列优化

2024-02-04 12:20

本文主要是介绍力扣 第 123 场双周赛 解题报告 | 珂学家 | 二维偏序+单调队列优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

image.png

执手看歌敲金钗,笑语落珠明眸睐。
忽然蝴蝶春风满,焉教冷镜瘦朱颜。


整体评价

T3是基于map的前缀和的变形题,T4是二维偏序的一道应用题。

题外话,力扣还是实现N久之前的承诺了,命名权奖励,赞一个。


T1. 三角形类型 II

思路: 模拟

class Solution {public String triangleType(int[] nums) {// 先判合法性Arrays.sort(nums);if (nums[0] + nums[1] <= nums[2]) return "none";if (nums[0] == nums[1] && nums[1] == nums[2]) {return "equilateral";} else if (nums[0] == nums[1] || nums[1] == nums[2]) {return "isosceles";} else {return "scalene";}}
}

T2. 人员站位的方案数 I

和T4一起讲


T3. 最大好子数组和

思路: 基于map的前缀和应用

这边需要以值作为key, value为最小的前缀和(需向前偏移一位)

更新的时候,需要分类讨论,v为当前值

  • v − k v - k vk
  • v + k v + k v+k
class Solution {public long maximumSubarraySum(int[] nums, int k) {long inf = Long.MIN_VALUE / 10;long res = inf;// 维护最小的前缀和Map<Long, Long> minMap = new HashMap<>();long acc = 0;for (int i = 0; i < nums.length; i++) {long v = nums[i];acc += v;if (minMap.containsKey(v - k)) {res = Math.max(acc - minMap.get(v - k), res);}if (minMap.containsKey(v + k)) {res = Math.max(acc - minMap.get(v + k), res);}// 更新if (!minMap.containsKey(v) || acc - v < minMap.get(v)) {minMap.put(v, acc - v);}}return res == inf ? 0 : res;}}

T4. 人员站位的方案数 II

思路: 二维偏序 + 枚举

对于偏序题,一般先固定一个维度

  1. 先按x坐标从小到大排序,
  2. 再按照y坐标从大到小排序

因为题目指定左上角,右下角

然后枚举左右端点,check是否满足需求即可。

在枚举的过程中,可以引入

单调队列优化 单调队列优化 单调队列优化

实际上只要维护最接近左端点y坐标(严格小于等于)的单变量即可, 递增状态

这样整个时间复杂度可以降为

  • 排序 O ( n l o g n ) O(nlogn) O(nlogn)
  • 枚举左右端点 O ( n 2 ) O(n^2) O(n2)

最终为 O ( n 2 ) O(n^2) O(n2)

class Solution {public int numberOfPairs(int[][] points) {// 按x从小到大,按y从大到小Arrays.sort(points, Comparator.comparingInt((int[] p) -> p[0]).thenComparingInt(p -> -p[1]));int res = 0;int n = points.length;for (int i = 0; i < n; i++) {// 维护最接近左端点y值的值(严格小于等于)int nearest = Integer.MIN_VALUE;for (int j = i + 1; j < n; j++) {if (points[j][1] <= points[i][1]) {if (points[j][1] > nearest) {res++;nearest = points[j][1];}}}}return res;}
}

  • 离散化+二维前缀和 (补充)

这个解法应该更加的直观

class Solution {// 离散化Map<Integer, Integer> discrete(List<Integer> ps) {TreeSet<Integer> range = new TreeSet<>(ps);Map<Integer, Integer> ids = new HashMap<>();int ptr = 0;for (var k: range) {ids.put(k, ptr++);}return ids;}public int numberOfPairs(int[][] points) {int n = points.length;int res = 0;Map<Integer, Integer> xs = discrete(Arrays.stream(points).map(p -> p[0]).collect(Collectors.toList()));Map<Integer, Integer> ys = discrete(Arrays.stream(points).map(p -> p[1]).collect(Collectors.toList()));int h = ys.size(), w = xs.size();int[][] area = new int[h][w];for (int[] p: points) {area[ys.get(p[1])][xs.get(p[0])] = 1;}int[][] pre = new int[h + 1][w + 1];for (int i = 0; i < h; i++) {for (int j = 0; j < w; j++) {pre[i + 1][j + 1] = pre[i + 1][j] + pre[i][j + 1] - pre[i][j] + area[i][j];}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i == j) continue;if (points[i][0] <= points[j][0] && points[i][1] >= points[j][1]) {int ty = ys.get(points[i][1]), by = ys.get(points[j][1]);int tx = xs.get(points[j][0]), bx = xs.get(points[i][0]);int s = pre[ty + 1][tx + 1] - pre[ty + 1][bx] - pre[by][tx + 1] + pre[by][bx];if (s == 2) {res ++;}}}}return res;}
}

写在最后

image.png

这篇关于力扣 第 123 场双周赛 解题报告 | 珂学家 | 二维偏序+单调队列优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分