1. 题意

求给定数组中下标 ( i , j , k ) (i,j,k) (i,j,k)的对数, 且满足

i < j < k , 2 a [ j ] = a [ i ] = a [ k ] i < j <k,2 a[j]=a[i]=a[k] i<j<k,2a[j]=a[i]=a[k]

2. 题解

2.1 枚举中间

三个数枚举中间那个数,再存前缀和后缀个数。

class Solution {
public:int specialTriplets(vector<int>& nums) {unordered_map<int,int> left;unordered_map<int,int> right;for (int num: nums) {right[num]++;}int ans = 0;int MOD = 1e9 + 7;int sz = nums.size();for (int i = 0; i < sz ; ++i) {int v = nums[i];right[v]--;ans = ans + (int) ( (long long)left[2 * v] * right[ 2 * v] % MOD) ;ans %= MOD;left[v]++;}return ans;}
};
2.2 枚举右边,维护左边

我们用两个哈希表记录,哈希表 s 1 s_1 s1记录值为 v v v的个数;
哈希表 s 12 s_{12} s12记录序列 ( 2 v , v ) (2v,v) (2v,v)的个数。

我们从左往右遍历,对每个值 v v v v m o d 2 = = 0 v \mod 2== 0 vmod2==0, 相应的三元组个数为 s 12 { v / 2 } s_{12}\{ v / 2\} s12{v/2}

s 12 { v } s_{12}\{v\} s12{v}的值需要累加上 s 1 { 2 v } s_1\{2v\} s1{2v}

s 1 { v } s_1\{v\} s1{v}累加。注意顺序不能变,因为可能出现 0 , 0 , 0 0,0,0 0,0,0这种情况。

class Solution {
public:int specialTriplets(vector<int>& nums) {unordered_map<int,int> s1;unordered_map<int,int> s12;int MOD = 1e9 + 7;long long ans = 0;int sz = nums.size();for (int i = 0; i < sz; ++i) {int v = nums[i];if ( v % 2 == 0) {ans = (ans + s12[ v / 2]) % MOD;}s12[ v ] = ( s1[ v * 2 ] + s12[ v ] ) % MOD;s1[ v ]++;}return ans;}
};
2.3 二分

第一次遍历直接记录每个数出现的位置;

再次遍历,对于位置 j ∈ [ 1 , n − 1 ] j \in [1,n-1] j[1,n1]

查找值为 2 a [ j ] 2a[j] 2a[j]出现位置中第一个不小于 j j j的下标。

这样就可以算出 a [ j ] a[j] a[j]的左边和右 2 a [ j ] 2a[j] 2a[j]的个数

class Solution {
public:int specialTriplets(vector<int>& nums) {unordered_map<int, vector<int>> h;int n = nums.size();for ( int i = 0; i < n; ++i) {h[ nums[i] ].push_back( i );}int ans = 0;int MOD = 1e9+7;for (int i = 1; i < n - 1; ++i) {int tg = 2 * nums[ i ];auto it = std::lower_bound( h[tg].begin(), h[tg].end(), i);int ln = static_cast<int>( it - h[tg].begin());int rn = static_cast<int>( h[tg].end() - it);if (it != h[tg].end() && *it == i) rn--;ans = ans  + (long long) ln * rn % MOD;ans %= MOD;}return ans;}
};

3. 参考

03xf

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

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

相关文章

Sentinel(一):Sentinel 介绍和安装

一、Sentinel 介绍 1、什么是 Sentinel&#xff1f; 一句话来说&#xff0c;Sentinel就是&#xff1a;分布式系统的流量卫兵&#xff08;官网&#xff09;。 随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点&#xff0c;在流量 控制…

pyspark 初试

1、安装jdk sudo apt-get install openjdk-17-jdk 2、安装spark curl -o spark.tgz https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-4.0.0/spark-4.0.0-bin-hadoop3.tgz tar -xvf spark.tgz mv spark-4.0.0-bin-hadoop3 /opt/spark修改 /etc/profile 添加 exp…

深入解析select模型:FD_SET机制与1024限制的终极指南

在Linux网络编程中&#xff0c;select函数是最经典的I/O多路复用技术之一&#xff0c;但其核心机制FD_SET的1024限制常成为高并发系统的瓶颈。本文将深入剖析FD_SET实现原理&#xff0c;并提供突破限制的实战方案。 一、FD_SET底层结构解析 FD_SET本质是固定长度的位图数组&am…

C函数基础.go

前言&#xff1a; 在Go语言中&#xff0c;函数是构成程序的基本模块&#xff0c;它封装了一段具有特定功能的代码&#xff0c;使得代码更易读&#xff0c;更易维护和重用。熟练掌握函数的定义、调用以及相关特性是成为Go语言开发者的必经之路。 目录 函数定义&#xff1a;给代…

什么是池化

池化是深度学习中用于降低数据维度、提取核心特征的一种操作&#xff0c;主要应用于卷积神经网络&#xff08;CNN&#xff09;。其核心思想是通过对局部区域进行聚合统计&#xff08;如取最大值、平均值&#xff09;&#xff0c;保留关键信息的同时减少计算量。 池化的作用 降维…

C++ 性能分析工具:Valgrind 与 perf

在 C 开发中&#xff0c;性能优化是提升软件质量的关键环节。内存泄漏和 CPU 资源消耗是最常见的性能瓶颈&#xff0c;而 Valgrind 和 perf 作为专业的性能分析工具&#xff0c;能帮助开发者精准定位这些问题。下面将从工具原理、使用方法、实战案例等方面进行详细介绍。 一、…

ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展

&#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09; 目录 &#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09;&#x1f3af; 引言&#x1f9f0…

Cursor Rules 的核心定位与作用 DevOps是

Cursor Rules 是 AI 编程工具 Cursor IDE 中的核心功能&#xff0c;用于约束 AI 生成代码的行为&#xff0c;确保其符合项目规范、编码风格或特定技术需求。它本质上是一套持久化、可复用的指令集&#xff0c;会动态插入到 AI 模型的上下文提示中&#xff0c;指导其生成代码的逻…

Qt事件处理机制

事件的概念 在Qt中&#xff0c;以事件驱动UI工具集&#xff0c;包括信号和槽都依赖于Qt的事件处理机制。通常事件是由窗口系统或Qt自身产生的&#xff0c;用以响应所发生的各类事情。如&#xff1a;用户按下并释放键盘或鼠标、窗口缩放后重绘、定时器到时等。如下图&#xff1…

【慧游鲁博】【11】小程序端·游览画卷修改·支持图片url格式·结合图床上传和加载·数据对接

文章目录 需求修改细节前端主要修改点说明&#xff1a;前端传递格式 后端ArtifactItem 类&#xff1a;ScrollServiceImpl 类&#xff1a;修改 InfoPanel 结构重构 ScrollHorizontalRollComposer修改后的 ScrollHorizontalRollComposer移除冗余代码修改总结 数据流图片格式兼容性…

攻克SQL审核“最后堡垒”!PawSQL首发T-SQL存储过程深度优化引擎

为什么存储过程审核那么难&#xff1f; 存储过程将数据操作逻辑固化在数据库层&#xff0c;一次编译、多次执行&#xff0c;既能大幅提升性能&#xff0c;也能通过权限隔离增强安全。然而&#xff0c;正因其逻辑复杂、分支众多&#xff0c;存储过程内部的 SQL 审核与优化常常成…

计算机网络零基础完全指南

目录 🌐 什么是计算机网络 生活中的类比 计算机网络的本质 网络的发展历程 🏠 网络IP详解(重点) 1. IP地址是什么? 生活例子:IP地址就像门牌号 IP地址的格式 IP地址的二进制表示 2. IP地址的分类详解 A类地址(大型网络) B类地址(中型网络) C类地址(小…

DL___线性神经网络

1&#xff09;回归&#xff08;regression&#xff09;是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域&#xff0c;回归经常用来表示输入和输出之间的关系。 2&#xff09;一般回归是和预测有关&#xff0c;比如预测价格(房屋&#xff0c;…

WSL2安装与使用(USB、GPU、虚拟机、图形界面)

文章目录 前言WSL2安装&#xff08;手动安装&#xff09;WSL2基础使用VS Code与WSL2配合使用连接USB设备WSL2中使用GPU&#xff08;RTX5060Ti 16G&#xff09;与虚拟机兼容使用&#xff08;Virtual Box&#xff09;图形与桌面环境WSL消失&#xff08;灾难性故障&#xff09;问题…

uni-app项目实战笔记16--实现头部导航栏效果

先来看效果&#xff1a; 要求&#xff1a;顶部导航栏要始终固定在上方&#xff0c;不随页面上下拖动而消失。 代码实现&#xff1a; 1.定义一个自定义导航栏组件&#xff1a;custom-nav-bar.vue&#xff0c;并写入如下代码&#xff1a; <template><view class"…

web3.js 核心包及子模块

. 核心包 (web3) 功能:提供基础连接、工具函数和核心功能。 包含子模块: web3.eth - 以太坊区块链交互 web3.utils - 辅助工具函数 web3.shh - Whisper 协议(已废弃) web3.bzz - Swarm 去中心化存储(已废弃) web3.net - 网络相关功能 web3.contract - 智能合约交互 web3.…

训练检测之前的视频抽帧

接下来安装pytorch Previous PyTorch Versions 视频抽帧 import cv2def extract_frames(video_path, output_folder, frame_rate1):"""从视频中抽取帧。:param video_path: 视频文件的路径:param output_folder: 存储帧的文件夹路径:param frame_rate: 抽取的…

智能家居HA篇 二、配置Home Assistant并实现外部访问

智能家居HA篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学 二、通过Cpolar配置Home Assistant并实现外部访问 文章目录 智能家居HA篇前言一、内网穿透工具&#xff08;cpolar&#xff09;二、映射HA端口1.访问cpolar仪表2.创建账号并登录3.创建隧道 三、HA设置及公网访…

day09——Java基础项目(ATM系统)

文章目录 Java项目实战&#xff1a;手把手开发ATM银行系统&#xff08;附完整源码&#xff09;一、系统架构设计1. 三层架构模型2. 核心数据结构 二、核心功能实现1. 开户功能&#xff08;含唯一卡号生成&#xff09;2. 登录安全验证3. 存取款业务4. 安全转账实现 三、账户安全…

计算机网络:(五)信道复用技术,数字传输系统,宽带接入技术

计算机网络&#xff1a;&#xff08;五&#xff09;信道复用技术&#xff0c;数字传输系统&#xff0c;宽带接入技术 前言一、信道复用技术1. 为什么需要复用技术&#xff1f;2. 频分复用&#xff08;FDM&#xff09;3. 时分复用&#xff08;TDM&#xff09;4. 统计时分复用&am…