力扣 第 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/450977.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VC++中使用OpenCV绘制直线、矩形、圆和文字

VC中使用OpenCV绘制直线、矩形、圆和文字 在VC中使用OpenCV绘制直线、矩形、圆和文字非常简单&#xff0c;分别使用OpenCV中的line、rectangle、circle、putText这四个函数即可。具体可以参考OpenCV官方文档&#xff1a;https://docs.opencv.org/4.x/index.html 下面的代码展…

通过手写简易版RPC理解RPC原理

RPC是什么 所谓的RPC其实是为了不同主机的两个进程间通信而产生的&#xff0c;通常不同的主机之间的进程通信&#xff0c;程序编写需要考虑到网络通信的功能&#xff0c;这样程序的编写将会变得复杂。RPC就来解决这一问题的&#xff0c;一台主机上的进程对另外一台主机的进程发…

jupyter notebook更改工作目录的2个细节

详细步骤参考知乎原文&#xff1a; 如何更改Jupyter Notebook的默认工作路径&#xff1f; - 知乎 (zhihu.com​​​​​​) 步骤4中需要删除 #符号和后面的空格&#xff01;一定要删除空格&#xff0c;否则会出现语法错误的报错 步骤5中&#xff0c;经过评论区提醒后&#xf…

三维重建方法3D gaussian splatting与NeRF的区别和异同

最近学习了一些三维重建相关的内容&#xff0c;目前比较主要的重建流派就是3DGS以及NeRF&#xff0c;NeRF作为2020年发布的文章轰动一时&#xff0c;影响深远&#xff0c;有很多NeRF based的相关工作在这些年涌现。3DGS作为2023年的new talk of the town&#xff0c;其在保证合…

HBase 数据导入导出

HBase 数据导入导出 1. 使用 Docker 部署 HBase2. HBase 命令查找3. 命令行操作 HBase3.1 HBase shell 命令3.2 查看命名空间3.3 查看命名空间下的表3.4 新建命名空间3.5 查看具体表结构3.6 创建表 4. HBase 数据导出、导入4.1 导出 HBase 中的某个表数据4.2 导入 HBase 中的某…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客&#xff0c;网上也有很多教程&#xff0c;很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

代码随想录算法训练营DAY11 | 栈与队列 (2)

一、LeetCode 20 有效的括号 题目链接&#xff1a;20.有效的括号https://leetcode.cn/problems/valid-parentheses/ 思路&#xff1a;遇到左括号直接进栈&#xff1b;遇到右括号判断站顶是否有匹配的括号&#xff0c;没有就返回flase&#xff0c;有就将栈顶元素出栈&#xff1…

ctfshow——文件包含

文章目录 web 78——php伪协议第一种方法——php://input第二种方法——data://text/plain第三种方法——远程包含&#xff08;http://协议&#xff09; web 78——str_replace过滤字符php第一种方法——远程包含&#xff08;http://协议&#xff09;第二种方法——data://&…

Nicn的刷题日常之杨氏矩阵(三种方法求解,逐级递增详解,手把手教学,建议三连收藏)

目录 1.杨氏矩阵知识普及&#xff1a;什么是样式矩阵 2.题目描述 3.解题 3.1暴力求解&#xff0c;遍历法 3.2巧妙解题&#xff1a;对角元素法 3.3将巧解法封装为函数 4.结语 1.杨氏矩阵知识普及&#xff1a;什么是样式矩阵 杨氏矩阵&#xff0c;是对组合表示理论和…

蓝牙 - BLE Basics

BLE Basics [ BLE基础 ] 需要了解的两个主要概念是 BLE 设备的两种模式&#xff1a; Two major concepts to know about are the two modes of BLE devices: * 广播模式&#xff08;也称为通用访问配置文件 GAP&#xff09; * 连接设备模式&#xff08;也称为通用属性配置文件…

halcon中的坐标系相关

一、定义 世界坐标系&#xff1a;真实世界中物体实际位置&#xff08;三维&#xff09; 相机坐标系&#xff1a;以镜头光心为原点&#xff0c;光轴为Z轴&#xff08;三维&#xff09; 图像物理坐标系&#xff1a;以成像图像中心维原点&#xff08;二维&#xff09; 像素坐标系…

如何计算两个指定日期相差几年几月几日

一、题目要求 假定给出两个日期&#xff0c;让你计算两个日期之间相差多少年&#xff0c;多少月&#xff0c;多少天&#xff0c;应该如何操作呢&#xff1f; 本文提供网页、ChatGPT法、VBA法和Python法等四种不同的解法。 二、解决办法 1. 网页计算法 这种方法是利用网站给…