【C++ 基础数学 】2121. 2615相同元素的间隔之和|1760

ops/2024/9/25 3:12:53/

本文涉及的基础知识点

基础数学

LeetCode2121. 相同元素的间隔之

难度分:1760
令2165,此题几乎相等。
给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。
arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] arr[j] 之间的间隔是 |i - j| 。
返回一个长度为 n 的数组 intervals ,其中 intervals[i] 是 arr[i] arr 中每个相同元素(与 arr[i] 的值相同)的 间隔之
注意:|x| 是 x 的绝对值。
示例 1:
输入:arr = [2,1,3,1,2,3,3]
输出:[4,2,7,2,4,4,5]
解释:

输入:arr = [10,5,10,10]
输出:[5,0,3,4]
解释:

  • 下标 0 :另两个 10 在下标 2 3 ,|0 - 2| + |0 - 3| = 5
  • 下标 1 :只有这一个 5 在数组中,所以到相同元素的间隔之是 0
  • 下标 2 :另两个 10 在下标 0 3 ,|2 - 0| + |2 - 3| = 3
  • 下标 3 :另两个 10 在下标 0 2 ,|3 - 0| + |3 - 2| = 4
    提示:
    n == arr.length
    1 <= n <= 105
    1 <= arr[i] <= 105

C++

indexs[i] 记录nums中所有值为i的下标。令 v = indexs[i]。
v[0]的距离各下标为: ∑ i : v . s i z e ( ) − 1 ( v [ i ] − v [ 0 ] ) \sum_{i:}^{v.size()-1}(v[i]-v[0]) i:v.size()1(v[i]v[0]) v[j]也可以这样计算,但这样做的总时间复杂度是:O(nn)。
可以通过v[i] 计算v[i+1]:
令有n1个下标<i,有n2个下标大于i+1。
n1个下标 的距离增加了: v[i+1]- v[i]
n2个下标的距离减少了: v[i+1]- v[i]
即:v[i+1]的总距离 = v[i]的总距离+ (n1-n2)*( v[i+1]- v[i])
n1 =i n2 = n - i -2

代码

核心代码

class Solution {public:vector<long long> getDistances(vector<int>& arr) {const int N = arr.size();vector<vector<int>> indexs(100'000 + 1);for (int i = 0; i < arr.size(); i++) {indexs[arr[i]].emplace_back(i);}vector<long long> ret(arr.size());for (const auto& v : indexs) {if (v.empty()) { continue; }long long cur = accumulate(v.begin(), v.end(), 0LL) - (long long)v.front() * v.size();ret[v[0]] = cur;for (int i = 0; i + 1 < v.size(); i++) {ret[v[i + 1]] = ret[v[i]] + ((long long)i-(v.size() - i - 2 )) * ((long long)v[i + 1] - v[i]);}}return ret;}};

单元测试

vector<int> arr;TEST_METHOD(TestMethod11){arr = { 2, 1, 3, 1, 2, 3, 3 };auto res = Solution().getDistances(arr);AssertEx(vector<long long>{4, 2, 7, 2, 4, 4, 5}, res);}TEST_METHOD(TestMethod12){arr = { 10,5,10,10 };auto res = Solution().getDistances(arr);AssertEx(vector<long long>{5,0,3,4}, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.ppmy.cn/ops/115590.html

相关文章

探索图像生成大模型Imagen:从理论到代码实践

一、引言 在当今的人工智能领域&#xff0c;图像生成技术取得了令人瞩目的进展。其中&#xff0c;Imagen作为一款强大的图像生成大模型&#xff0c;吸引了众多研究者和开发者的目光。它能够生成高质量、逼真的图像&#xff0c;为艺术创作、游戏开发、虚拟现实等众多领域带来了无…

[Linux]用户管理指令

开机/重启/登录/注销 进入xhsell 或者虚拟系统中, 右键桌面打开终端, 在终端执行命令, 重启或关机linux系统 建议使用普通账号登录, 如果权限不够时, 使用 su - 用户名 命令切换到超管, 然后再使用 logout命令退回到普通账号, logout 不能在图形界面的终端中使用 用户管理 Li…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

作业帮大数据面试题及参考答案

HashMap 和 HashTable 的区别是什么? HashMap 和 HashTable 都是 Java 中用于存储键值对的数据结构,但它们之间存在一些重要的区别: 线程安全性: HashTable 是线程安全的,它的方法都被 synchronized 关键字修饰,这意味着在多线程环境下可以直接使用而无需额外的同步措施。…

Mysql数据库实现分布式锁

使用 MySQL 数据库实现分布式锁可以确保在多实例环境中定时任务不重复执行。 创建锁表 CREATE TABLE distributed_lock (lock_name VARCHAR(64) PRIMARY KEY,locked_by VARCHAR(64),locked_at DATETIME,timeout_at DATETIME );获取锁 在获取锁时&#xff0c;你需要尝试插入一…

金仓数据库 KingbaseES参考手册 (8. 函数(九))

8.299. SCALE 用法&#xff1a; scale(numeric)功能&#xff1a; SCALE返回参数的精度&#xff08;小数点后的位数&#xff09;。 例子&#xff1a; SELECT scale(8.41);8.300. SCORE 用法&#xff1a; SCORE(lable number)输入参数&#xff1a; lable&#xff1a;表示第几个co…

Java——认识String类

在 C 语言中已经涉及到字符串了&#xff0c;但是在 C 语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想&#xff0c;而字 符串应用又非…

vue vue-router.esm.js:2118 Error: Cannot find module

项目场景&#xff1a; 在项目开发过程中&#xff0c;因为nodejs版本不清晰&#xff0c;导致安装依赖的时候&#xff0c;部分依赖版本不一致&#xff0c;导致出现问题。 问题描述 在项目开发的过程中&#xff0c;提示报错如下图&#xff0c;根据这个报错&#xff0c;有可能是本…