【算法套路】(数组中)等价转换

文章目录

  • 例题——2488. 统计中位数为 K 的子数组⭐
    • 【套路】子数组统计问题常用技巧:等价转换
  • 相似题目列表
    • 面试题 17.05. 字母与数字
    • 525. 连续数组
    • 1124. 表现良好的最长时间段
      • 解法1
      • 解法2——利用单调栈

例题——2488. 统计中位数为 K 的子数组⭐

https://leetcode.cn/problems/count-subarrays-with-median-k/description/
在这里插入图片描述
提示:

n == nums.length
1 <= n <= 10^5
1 <= nums[i], k <= n
nums 中的整数互不相同

【套路】子数组统计问题常用技巧:等价转换

https://leetcode.cn/problems/count-subarrays-with-median-k/solutions/1993439/deng-jie-zhuan-huan-pythonjavacgo-by-end-5w11/
注意,每个数字各不相同,整个数组中只有一个 k。

在这里插入图片描述
在这里插入图片描述

class Solution {public int countSubarrays(int[] nums, int k) {int pos = 0, n = nums.length;// 求出 k 的 poswhile (nums[pos] != k) ++pos;Map<Integer, Integer> cnt = new HashMap<>();cnt.put(0, 1);for (int i = pos - 1, x = 0; i >= 0; --i) {x += nums[i] < k? 1: -1;cnt.merge(x, 1, Integer::sum);}int ans = cnt.get(0) + cnt.getOrDefault(-1, 0);for (int i = pos + 1, x = 0; i < n; ++i) {x += nums[i] > k? 1: -1;// x 和 x - 1 对应 奇数长度和偶数长度ans += cnt.getOrDefault(x, 0) + cnt.getOrDefault(x - 1, 0);}return ans;}
}

本质上是「中心前后缀 + 哈希表计数」

核心在于「个数」,能得到一个和个数有关的数学式子,就可以转换成 1(或者 -1),毕竟在讨论个数的时候,每个元素的贡献就是 1 了。

相似题目列表

面试题 17.05. 字母与数字

https://leetcode.cn/problems/find-longest-subarray-lcci/description/
在这里插入图片描述
前缀和设置为 字母与数字数量之差,相同前缀和的一对可以组成一个子字符串。

class Solution {public String[] findLongestSubarray(String[] array) {int st = 0, ml = 0;int n = array.length, d = 0;Map<Integer, Integer> m = new HashMap<>();m.put(0, 0);for (int i = 0; i < n; ++i) {char ch = array[i].charAt(0);if (ch >= '0' && ch <= '9') d++;else d--;if (m.containsKey(d)) {int j = m.get(d);if (i - j + 1 > ml) {st = j;ml = i - j + 1;}} else m.put(d, i + 1);}String[] ans = new String[ml];System.arraycopy(array, st, ans, 0, ml);return ans;}
}

525. 连续数组

https://leetcode.cn/problems/contiguous-array/description/
在这里插入图片描述
跟上面那道题几乎一模一样。

class Solution {public int findMaxLength(int[] nums) {int d = 0, ans = 0;Map<Integer, Integer> m = new HashMap<>();m.put(0, 0);for (int i = 0; i < nums.length; ++i) {if (nums[i] == 1) d++;else d--;if (m.containsKey(d)) {int id = m.get(d);if (i - id + 1 > ans) ans = i - id + 1;} else m.put(d, i + 1);}return ans;}
}

1124. 表现良好的最长时间段

https://leetcode.cn/problems/longest-well-performing-interval/description/
在这里插入图片描述
提示:

1 <= hours.length <= 10^4
0 <= hours[i] <= 16

解法1

class Solution {public int longestWPI(int[] hours) {int n = hours.length, d = 0, ans = 0;Map<Integer, Integer> m = new HashMap<>();m.put(0, 0);for (int i = 0; i < n; ++i) {if (hours[i] > 8) d++;else d--;if (d > 0) ans = Math.max(ans, i + 1);else if (m.containsKey(d - 1)) {ans = Math.max(ans, i - m.get(d - 1) + 1);}if (!m.containsKey(d)) m.put(d, i + 1);}return ans;}
}

解法2——利用单调栈

https://leetcode.cn/problems/longest-well-performing-interval/solutions/2110211/liang-chong-zuo-fa-liang-zhang-tu-miao-d-hysl/

class Solution {public int longestWPI(int[] hours) {int n = hours.length;int[] s = new int[n + 1];ArrayDeque<Integer> stk = new ArrayDeque<>();stk.push(0);// 单调递减的单调栈for (int i = 1; i <= n; ++i) {s[i] = s[i - 1] + (hours[i - 1] > 8? 1: -1);if (s[i] < s[stk.peek()]) stk.push(i);}int ans = 0;for (int i = n; i > 0; --i) {while (!stk.isEmpty() && s[i] > s[stk.peek()]) {ans = Math.max(ans, i - stk.pop());}}return ans;}
}

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

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

相关文章

Proteus仿真--基于ADC0832设计的两路电压表

本文介绍基于ADC0832实现的双路电压表采集设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 采集芯片选用ADC0832&#xff0c;电压显示在LCD1602液晶显示屏上 仿真运行视频 Proteus仿真--基于ADC0832设计的两路电压表 附完整Proteus仿真资料代码资料…

【力扣206】反转链表

【力扣206】反转链表 一.题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1 &#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2 &#xff1a; 输入&#xff1a;head [1,2] 输出&#x…

sqlserver2019基本操作

一、下载管理工具 sql server2019官方的管理工具是SQL Server Management Studio 简称SSMS。 下载连接: https://learn.microsoft.com/zh-CN/sql/ssms/download-sql-server-management-studio-ssms?viewsql-server-ver16二、登录 1.连接服务器 点击 文件 --> 连接对象资…

harmonyOS学习笔记之stateStyles

stateStyles:多态样式 stateStyles可以依据组件的内部状态的不同,设置不同的样式 stateStyles是属性方法,可以根据状态来设置样式,类似于css伪类,但是语法不一样,ArkUI提供了四种状态: focused:获焦态 normal:正常态 pressed:按压态 disable:不可用态例如: Entry Component …

Mybatis-Plus更新时间字段不生效

一、背景 Mybatis-Plus是在Mybatis的基础上只做增强不做改变&#xff0c;主要是为简化开发。项目的背景是使用的就是Mybatis-Plus&#xff0c;但是在运行项目过程中发现一个问题&#xff0c;当使用Mybatis-Plus进行数据的更新的时候&#xff0c;更新字段没有按照我们所预想的进…

Springboot依赖注入时重复初始化Bean的问题

前言 最近做项目&#xff0c;发现了springboot2.7.x在参数initiate的时候可以反复初始化&#xff0c;而且首次异常后&#xff0c;第二次成功居然也可以启动&#xff0c;通过查看源代码发现了问题根源&#xff0c;且在springboot高版本3.x&#xff0c;就出现了了Configuration的…

qnx修改tcp和udp缓冲区默认大小

拷贝/home/test/qnx/qos223/target/qnx7/aarch64le/sbin/sysctl进系统中 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/sysctl.html kern.sbmax 默认262144&#xff0c;这个限制住了发送、接收缓冲器大小 ./sysctl -w kern.sbmax10000…

尺寸公差软件 AI自动化建模在电控器装配测量中的应用

在公差仿真分析中&#xff0c;公差仿真模型的建立&#xff0c;是耗时、繁琐&#xff0c;但又必需的一步&#xff1a;手动建立特征、手动建立装配、手动建立公差、手动建立测量。往往需要几天时至几十天&#xff0c;才能将模型建立完成。 幸运的是&#xff0c;随着AI&#xff0…

Kafka 架构深度解析:生产者(Producer)和消费者(Consumer)

Apache Kafka 作为分布式流处理平台&#xff0c;其架构中的生产者和消费者是核心组件&#xff0c;负责实现高效的消息生产和消费。本文将深入剖析 Kafka 架构中生产者和消费者的工作原理、核心概念以及高级功能。 Kafka 生产者&#xff08;Producer&#xff09; 1 发送消息到…

【Delphi】中使用Indy进行UDP广播通信

目录 一、服务器端&#xff08;接收端&#xff09; 二、客户端&#xff08;广播端&#xff09; Delphi中进行UDP广播通信函数代码&#xff1a; 一、服务器端&#xff08;接收端&#xff09; 在主界面上返放置一个TIdUDPServer控件&#xff0c;设置好该控件的监听端口&#…

专业课:递归非递归中序遍历

非递归中序遍历二叉树通常使用栈来辅助实现。 树结构&#xff1a; struct TreeNode {int data;TreeNode* left;TreeNode* right; };递归 void inorderTraversal(TreeNode *root){if(root ! nullptr){//中序遍历 “左孩子--根节点--右孩子”inOrder(root->lchild);printf(…

设计模式-结构型模式之代理设计模式

文章目录 八、代理设计模式 八、代理设计模式 代理设计模式通过代理控制对象的访问&#xff0c;可以详细访问某个对象的方法&#xff0c;在这个方法调用处理&#xff0c;或调用后处理。既(AOP微实现) 。 代理有分静态代理和动态代理&#xff1a; 静态代理&#xff1a;在程序…

c 实现的jpeg 8×8 离散余弦DCT 正向,逆向转换

理论公式&#xff1a; 验证数据 1.正向&#xff0c;数据源为YCbCr 88 数据 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <string.…

Android CardView基础使用

目录 一、CardView 1.1 导入material库 1.2 属性 二、使用(效果) 2.1 圆角卡片效果 2.2 阴影卡片效果 2.3 背景 2.3.1 设置卡片背景(app:cardBackgroundColor) 2.3.2 内嵌布局&#xff0c;给布局设置背景色 2.4 进阶版 2.4.1 带透明度 2.4.2 无透明度 一、CardView 顾名…

面试题:MySQL为什么选择B+树作为索引结构

文章目录 前言二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高四、B树&#xff1a;为磁盘而生五、B树六、感受B树的威力七、总结 前言 在MySQL中&#xff0c;无论是Innodb还是MyIsam&#xff0c;都使用了B树作索引结构(这里不考虑hash等其他索引)。本文…

GeoServer漏洞(CVE-2023-25157)

前半部分是sql注入一些语句的测试&#xff0c;后面是漏洞的复现和利用 Sql注入漏洞 1.登入mysql。 2.查看默认数据库 3.使用mysql数据库 4.查看表 1.查看user 表 2.写注入语句 创建数据库 时间注入语句 布尔注入语句 报错注入语句 Geoserver漏洞&#xff…

智能手机的分层架构

一、用户界面&#xff08;UI&#xff09; 在智能手机架构中&#xff0c;用户界面&#xff08;User Interface&#xff0c;简称 UI&#xff09;是用户与应用程序进行交互的媒介。UI可以视为应用层的一个重要部分&#xff0c;它包括所有可视化的元素和用户交互的组件。 以下是UI…

three.js--立方体

作者&#xff1a;baekpcyyy&#x1f41f; 使用three.js渲染出可以调节大小的立方体 1.搭建开发环境 1.首先新建文件夹用vsc打开项目终端 2.执行npm init -y 创建配置文件夹 3.执行npm i three0.152 安装three.js依赖 4.执行npm I vite -D 安装 Vite 作为开发依赖 5.根…

CentOS7搭建部署NTP服务器

服务端配置&#xff1a; yum install ntp ntpdate -y #下载安装包 修改配置文件&#xff0c;同步阿里的NTP服务器 vim /etc/ntp.conf systemctl start ntpd #启动该服务 ntpq -p #查看是否同步了阿里的NTP 服务端同步成功后&#xff0c;可以去新增…

网络安全现状

威胁不断演变&#xff1a; 攻击者不断变化和改进攻击方法&#xff0c;采用更复杂、更隐秘的技术&#xff0c;以逃避检测和追踪。这包括新型的勒索软件、零日漏洞利用和社交工程攻击等。 供应链攻击&#xff1a; 攻击者越来越关注供应链的弱点&#xff0c;通过在供应链中植入恶…