当前位置: 首页 > news >正文

力扣2615. 等值距离和


由数据范围是10^5,只能一次遍历,暴力是别想了,
看到arr[i] 等于所有 |i - j| 之和,这很明显是求距离和的方法—数学公式推导+前缀和
下面这一题也有类似的思路

1685. 有序数组中差绝对值之和

那我们如何处理满足 nums[j] == nums[i] 且 j != i 的所有 j这个条件呢?
我们可以用哈希表来存储,对于相同元素的值的下标/索引,我们可以选择把它存在一一个数组里面
也就是

unordered_map<int,vector<int>> mp; for(int i=0;i<nums.size();i++) { mp[nums[i]].push_back(i); }

这样具有相同的值的下标就到一个数组里面了!
然后,
我们可以取哈希表中的key值
得到一个索引数组(就是上文提到的对于相同元素的值的下标/索引,我们可以选择把它存在一一个数组里面)
我们只需要对这个数组中的每一个元素求一下 |i - j| 之和也就是sum(abs(i-j))
我们已知了装有i,j的数组(索引数组)那求起来就很好求
只需要对sum(abs(i-j))展开
因为带有绝对值,所以我们分成两部分
(这里就是把式子展开,具体可以自己列列式子和合并同类项)

sumleft和sumright sumleft=index*i-sum[i] sumright=(sum[a.size()]-sum[i+1])-index*(a.size()-(i+1)); sum=sumleft+sumright;

这样我们就求出了一个索引i它的sum(abs(i-j))的值
也就是题目中arr数组中的一个元素。
因此我们就可以写代码了

class Solution { public: long long sum[100005]; unordered_map<int,vector<int>> mp; vector<long long> distance(vector<int>& nums) { for(int i=0;i<nums.size();i++) { mp[nums[i]].push_back(i); } vector<long long> result(nums.size()); for(auto q:mp) { vector<int> a=q.second; for(int i=0;i<a.size();i++) { sum[i+1]=sum[i]+a[i]; } for(int i=0;i<a.size();i++) { int index=a[i]; long long sumleft=(long long)index*i-sum[i]; long long sumright=(sum[a.size()]-sum[i+1])-(long long)index*(a.size()-(i+1)); long long sum=sumleft+sumright; result[index]=sum; } } return result; } };

需要注意的是要开long long ,不仅是前缀和需要开long long ,在算sumleft和sunright的过程中遇到乘法的时候也需要开long long,这一点不得不防。
时间复杂度O(n)
这里是双重循环,但不代表是O(n^2)因为每次从哈希表中取数据是O(1)。

http://www.jsqmd.com/news/447211/

相关文章:

  • 使用python编程贪吃蛇单机小游戏(超详细讲解)
  • 倒立摆系统控制器设计报告
  • FTP服务器部署(vsftpd)
  • 贝叶斯分类
  • uniapp token过期的几种常见处理方案
  • ubuntu+windows双系统恢复
  • 7.28 进制交换|迭代器模式|map|子集按位或|带参递归
  • Elasticsearch-SQL终极指南:如何用SQL轻松查询Elasticsearch日志数据
  • 扫码枪写入案例。关于js原生聚焦以及扫码枪原理
  • 中医药方剂大模型开发方案
  • Qt/C++运行报错:exited with code -1073741819
  • iOS分页标签栏终极性能优化:快速解决XLPagerTabStrip滚动卡顿问题
  • 基于新型群智能优化算法的BP神经网络初始权值与偏置优化
  • 科研智能体平台设计与实现:社科类研究支持系统
  • RT-Thread ESP-Hosted
  • durable_rules模式匹配技术:DFA编译如何实现纳秒级字符串处理
  • local-web-server性能优化指南:让你的开发服务器飞起来
  • Flutter响应式管理面板AI功能集成:智能分析与自动化操作终极指南
  • 生产车间班组长绩效考核方案优化与绩效提升策略
  • 记录踩过的坑-金蝶云·苍穹平台-页面开发
  • 自平衡摩托车控制系统设计:Python实现方案
  • Ease高级特性:动态更新targetValue实现实时动画轨迹调整
  • 如何用Jspreadsheet CE快速创建动态数据表格:从数组到JSON的实战指南
  • REINFORCE、Remax、GRPO、DR.GRPO、DAPO、REINFORCE++、GPG、OPO、GSPO、SAPO、CLIP-COV、VC-PPO、VAPO对比
  • 微信小程序单元测试与集成测试完整指南:从入门到实战
  • (算法题)N个数求和
  • Flutter响应式管理面板终极容器化部署指南:Docker与Kubernetes实践
  • Clojure-lsp完全指南:从安装到精通的10个核心步骤
  • 终极指南:5个BackstopJS测试报告定制技巧与品牌化实战
  • IDEA与Gradle构建冲突,导致java重复类的解决方案