Leetcode - 147双周赛

目录

  • 一、3407. 子字符串匹配模式
  • 二、3408. 设计任务管理器
  • 三、3409. 最长相邻绝对差递减子序列
  • 四、3410. 删除所有值为某个元素后的最大子数组和

一、3407. 子字符串匹配模式

题目链接
在这里插入图片描述
字符串匹配问题,把字符串 p 分成两段 、,i 是 ’ * ’ 的下标,判断 s 是否包含这两段,且这两段处于不相交 && 有前后关系

代码如下:

class Solution {public boolean hasMatch(String s, String p) {int idx = p.indexOf('*');int i = s.indexOf(p.substring(0, idx));return i>=0 && s.substring(i+idx).contains(p.substring(idx+1));}
}

二、3408. 设计任务管理器

题目链接
在这里插入图片描述
使用哈希存当前每个 taskId,对应的 userId 和 priority,再使用堆存储 taskId 和 priority,按照 priority 排序,如果优先级相同,按照 taskId 排序。

  • TaskManager(),将数据存入哈希表和堆
  • add(),将数据存入哈希表和堆
  • edit(),更新哈希表,将更新后的数据存入堆
  • rmv(),更新哈希表 execTop(),不断的将数据排出堆,使用懒删除,如果当前数据存储在哈希表中,返回当前的 userId

代码如下:

class TaskManager {Map<Integer, int[]> map = new HashMap<>();PriorityQueue<int[]> que = new PriorityQueue<>((x,y)->x[1]==y[1]?y[0]-x[0]:y[1]-x[1]);public TaskManager(List<List<Integer>> tasks) {for(List<Integer> x : tasks){int userId = x.get(0), taskId = x.get(1), priority = x.get(2);map.put(taskId, new int[]{userId, priority});que.offer(new int[]{taskId, priority});}    }public void add(int userId, int taskId, int priority) {map.put(taskId, new int[]{userId, priority});que.offer(new int[]{taskId, priority});}public void edit(int taskId, int newP) {int[] t = map.get(taskId);t[1] = newP;map.put(taskId, t);que.offer(new int[]{taskId, t[1]});}public void rmv(int taskId) {map.remove(taskId);}public int execTop() {while(!que.isEmpty()){int[] t = que.poll();if(map.containsKey(t[0]) && map.get(t[0])[1] == t[1]){int user = map.get(t[0])[0];map.remove(t[0]);return user;}}return -1;}
}

三、3409. 最长相邻绝对差递减子序列

题目链接
在这里插入图片描述
定义 f [ i ] [ j ] f[i][j] f[i][j]: 以 x = n u m s [ i ] x = nums[i] x=nums[i] 为结尾的且与倒数第二个数的绝对值的差至少 j j j(即倒数第二个数为 x − j / x + j x-j/x+j xj/x+j)的子序列的最长长度。

对于 x = n u m s [ i ] x = nums[i] x=nums[i],题目要求两数差的绝对值是非递增的(即倒数第三个数和倒数第二个数的绝对差值 > = j >=j >=j ),分类讨论:

  • n u m s [ i ] nums[i] nums[i] 单独形成一个子序列 , f [ i ] [ j ] = 1 f[i][j] = 1 f[i][j]=1
  • 倒数第一个数和倒数第二个数的绝对差值 > j >j >j,也就是绝对差值 > = j + 1 >=j+1 >=j+1 f [ i ] [ j ] = f [ i ] [ j + 1 ] f[i][j] = f[i][j+1] f[i][j]=f[i][j+1]
  • 倒数第一个数和倒数第二个数的绝对差值 = j =j =j,也就是倒数第二个数的值为 x + j / x − j x+j/x-j x+j/xj f [ i ] [ j ] = m a x ( f [ l a s t [ x − j ] ] [ j ] , f [ l a s t [ x + j ] ] [ j ] ) f[i][j] = max(f[last[x-j]][j],f[last[x+j]][j]) f[i][j]=max(f[last[xj]][j]f[last[x+j]][j])
  • l a s t [ x ] last[x] last[x]:值为 x x x 的数在 n u m s nums nums 数组中的下标

最终 f [ i ] [ j ] = m a x ( 1 , f [ i ] [ j + 1 ] , f [ l a s t [ x + j ] ] [ j ] , f [ l a s t [ x − j ] ] [ j ] ) f[i][j] = max(1,f[i][j+1],f[last[x+j]][j],f[last[x-j]][j]) f[i][j]=max(1,f[i][j+1],f[last[x+j]][j],f[last[xj]][j])

代码如下:

class Solution {public int longestSubsequence(int[] nums) {int n = nums.length;int mx = nums[0], mn = nums[0];for(int x : nums){mx = Math.max(mx, x);mn = Math.min(mn, x);}int maxD = mx - mn;int ans = 0;int[][] f = new int[n][maxD+2];int[] last = new int[mx + 1];Arrays.fill(last, -1);for(int i=0; i<n; i++){int x = nums[i];for(int j=maxD; j>=0; j--){f[i][j] = Math.max(f[i][j+1], 1);if(x - j >= 0 && last[x - j] >= 0){f[i][j] = Math.max(f[i][j], f[last[x-j]][j] + 1);}if(x + j <= mx && last[x+j] >= 0){f[i][j] = Math.max(f[i][j], f[last[x+j]][j] + 1);}ans = Math.max(ans, f[i][j]);}last[x] = i;}return ans;}
}//定义f[x][j]:以值 x 结尾的且与倒数第二个数的绝对差值至少为 j 的子序列的最长长度
class Solution {public int longestSubsequence(int[] nums) {int n = nums.length;int mx = nums[0], mn = nums[0];for(int x : nums){mx = Math.max(mx, x);mn = Math.min(mn, x);}int maxD = mx - mn;int ans = 0;int[][] f = new int[mx+1][maxD+1];for(int x : nums){int fx = 1;for(int j=maxD; j>=0; j--){if(x-j >= 0){fx = Math.max(fx, f[x-j][j] + 1);}if(x+j <= mx){fx = Math.max(fx, f[x+j][j] + 1);}f[x][j] = fx;ans = Math.max(ans, fx);}}return ans;}
}

四、3410. 删除所有值为某个元素后的最大子数组和

题目链接
在这里插入图片描述
本题直接使用线段数来维护四个值——区间和,最大前缀和,最大后缀和,区间最大子数组和,代码如下:

class SegmentTree{private record Info(long sum, long pre, long suf, long ans){}Info[] tree;public SegmentTree(int[] nums){int n = nums.length;tree = new Info[n<<2];build(1, 0, n-1, nums);}void build(int i, int l, int r, int[] nums){if(l == r){int val = nums[l];tree[i] = new Info(val, val, val, val);return;}int m = (l + r) / 2;build(i<<1, l, m, nums);build(i<<1|1,m+1,r,nums);tree[i] = merge(tree[i<<1],tree[i<<1|1]);}Info merge(Info a, Info b){return new Info(a.sum + b.sum,Math.max(a.pre, a.sum+b.pre),Math.max(b.suf, a.suf+b.sum),Math.max(Math.max(a.ans, b.ans), a.suf+b.pre));}void update(int o, int l, int r, int i, int val){if(l == r){tree[o] = new Info(val, val, val, val);return;}int m = (l + r) / 2;if(i <= m){update(o<<1, l, m, i, val);}else{update(o<<1|1, m+1, r, i, val);}tree[o] = merge(tree[o<<1], tree[o<<1|1]);}long queryAll(){return tree[1].ans;}
}
class Solution {public long maxSubarraySum(int[] nums) {SegmentTree t = new SegmentTree(nums);long ans = t.queryAll();if(ans <= 0) return ans;int n = nums.length;Map<Integer, List<Integer>> map = new HashMap<>();for(int i=0; i<n; i++){if(nums[i] < 0)map.computeIfAbsent(nums[i], e->new ArrayList<>()).add(i);}for(List<Integer> x : map.values()){for(int i : x){t.update(1, 0, n-1, i, 0);}ans = Math.max(ans, t.queryAll());for(int i : x){t.update(1, 0, n-1, i, nums[i]);}}return ans;}
}

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

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

相关文章

SqlSugar连接达梦数据库集群超时或异常缓慢

《SqlSugar配置连接达梦数据库集群》文章中介绍SqlSugar连接达梦数据库集群&#xff0c;只需按下图所示位置添加dm_svc.conf文件&#xff0c;并在SqlSugar的连接字符串中指定服务名即可。   但在使用过程中发现&#xff0c;基于.net 6开发的WebApi&#xff0c;编译为ANYCPU&…

探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码

嘿&#xff0c;小伙伴们&#xff01;今天咱们要把 JMeter 里超厉害的 Interleave Controller&#xff08;交错控制器&#xff09;研究个透&#xff0c;让你从新手直接进阶成高手&#xff0c;轻松拿捏各种性能测试难题&#xff01; 一、Interleave Controller 深度剖析 所属家族…

C++内存泄露排查

内存泄漏是指程序动态分配的内存未能及时释放&#xff0c;导致系统内存逐渐耗尽&#xff0c;最终可能造成程序崩溃或性能下降。在C中&#xff0c;内存泄漏通常发生在使用new或malloc等分配内存的操作时&#xff0c;但没有正确地使用delete或free来释放这块内存。 在日常开发过程…

ubuntu 下生成 core dump

在Ubuntu下,发现程序崩溃后不生成core dump文件, 即使设置了ulimit -c unlimited后仍然无效。 1.ulimit -c unlimited 输出的的含义是核心转储文件的大小限制,单位是blocks,默认是0,表示不生成core dump文件。 2. 重设core_pattern ulimit -c unlimited后,核心转储文件…

Scala语言的网络编程

Scala语言的网络编程 引言 网络编程是指通过网络进行数据通信的程序设计。随着互联网的飞速发展&#xff0c;网络编程已经成为现代应用开发中不可或缺的一部分。在众多编程语言中&#xff0c;Scala凭借其强大的功能与灵活性逐渐受到开发者的青睐。由于其兼容Java的特性&#…

服务器/电脑与代码仓gitlab/github免密连接

git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…

Rubyer-WPF:打造优雅、精致的 WPF 用户界面

在桌面应用开发领域&#xff0c;WPF&#xff08;Windows Presentation Foundation&#xff09;凭借其强大的 UI 设计能力和丰富的功能&#xff0c;始终是开发者们青睐的工具之一。今天&#xff0c;我将为大家介绍一款专注于 WPF UI 设计的优秀项目——Rubyer-WPF&#xff0c;它…

蓝耘:GPU算力云服务的技术探索与AIGC应用支持

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、蓝耘的核心优势 1. 行业领先的基础设施 …

《Spring Framework实战》15:4.1.4.6.方法注入

欢迎观看《Spring Framework实战》视频教程 方法注入 在大多数应用场景中&#xff0c;容器中的大多数bean都是单例&#xff08;singletons&#xff09;的。当单例bean需要与另一个单例bean协作或非单例bean需与另一非单例bean协作时&#xff0c;通常通过将一个bean定义为另一个…

【ROS2】☆ launch之Python

☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch&#xff0c;而ROS2保留了XML 格式launch&#xff0c;还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好&#xff0c;但是ROS2官方推荐使用Python方式编写…

了解 Ansys Mechanical 中的网格方法:综合指南

网格是每个有限元分析 &#xff08;FEA&#xff09; 仿真的支柱。它将几何图形划分为离散单元&#xff0c;使 Ansys Mechanical 能够近似模型在各种条件下的行为。结构良好的网格可确保准确、可靠和计算高效的结果&#xff0c;而结构不佳的网格可能会导致错误、收敛问题或不必要…

知识追踪模型DKT,DLKT详解及代码复现

定义与应用 知识追踪是一种 教育技术领域的重要方法 ,旨在通过分析学生的学习行为和表现,预测其掌握特定知识点的程度。这种方法的核心在于建立能够反映学习者认知状态的动态模型,从而实现对学生学习进度的实时监控和个性化指导。 DKT模型 DKT模型 是最早的知识追踪模型之…

学习threejs,使用TrackballControls相机控制器

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.TrackballControls 相…

Android 修改SVG属性并显示图片(AndroidSvg)

引入依赖&#xff1a; dependencies {implementation com.caverock:androidsvg-aar:1.4 }核心代码&#xff1a; import com.caverock.androidsvg.SVG import org.w3c.dom.Document import java.io.StringWriter import javax.xml.transform.OutputKeys import javax.xml.tran…

Linux服务器查看【可用端口号连接】的命令和方式【netstat,ss,lsof】

Linux服务器查看可用连接的端口号的命令和方式 前言&#xff1a;1. 使用netstat命令&#xff08;netstat命令详解及使用指南&#xff09;一、什么是netstat二、基本使用方法与参数解释三、输出结果字段含义&#xff1a;四、查找可用于SSH连接的端口示例五、部分高级用法&#x…

云集电商:数据库的分布式升级实践|OceanBase案例

电商行业对数据库有哪些需求 云集电商作为一家传统电商企业&#xff0c;业务涵盖了美妆个护、服饰、水果生鲜、健康保健等多个领域&#xff0c;在创立四年后在纳斯达克上市&#xff08;股票代码&#xff1a;YJ&#xff09;。与京东、淘宝、拼多多等电商平台不同&#xff0c;云…

Vue.js 事件绑定:v-on 和 @

Vue.js 事件绑定&#xff1a;v-on 和 今天我们来聊聊 Vue.js 中一个超常用的功能——事件绑定。只需要写几行代码&#xff0c;你就能轻松让页面和用户的交互灵动起来。Vue 提供了一个指令叫 v-on&#xff0c;还有它的简写形式 &#xff0c;两者都可以用来绑定事件。 什么是事…

智能租赁系统提升效率与服务质量的全新解决方案

内容概要 智能租赁系统的崛起就像一场春雨&#xff0c;滋润着租赁行业的每一个角落。它通过先进的技术架构&#xff0c;结合数据管理&#xff0c;优化了以往繁琐的租赁流程&#xff0c;让整个过程如同顺畅的流水。比如&#xff0c;通过智能算法自动计算费用&#xff0c;使得用…

ClickHouse大数据准实时更新

一、问题背景 最近有一个项目需求&#xff0c;需要对日活跃的3万辆车的定位数据进行分析&#xff0c;并支持查询和统计分析结果。每辆车每天产生1条分析结果数据&#xff0c;要求能够查询过去一年内的所有分析结果。因此&#xff0c;每月需要处理约90万条记录&#xff0c;一年大…

苹果手机(IOS系统)出现安全延迟进行中如何关闭?

苹果手机&#xff08;IOS系统&#xff09;出现安全延迟进行中如何关闭&#xff1f; 一、设置二、隐私与安全性三、失窃设备保护关闭 一、设置 二、隐私与安全性 三、失窃设备保护关闭