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

前缀和之距离和

  参考资料来源灵神在力扣所发的题单,仅供分享学习笔记和记录,无商业用途。

核心思路:在给定的区间内根据当前数划分小于和大于部分分别求距离

应用场景:一维场景:数组中「区间距离和」

问题示例:

给定一个数组 nums,求任意区间 [L, R] 内所有元素到某个点(如区间中点、特定索引)的距离和。

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

class Solution {
public:vector<int> getSumAbsoluteDifferences(vector<int>& nums) {//核心思路:在区间内分别找到大于小于区间,分开计算再相加即可。//前缀和计算距离和公式:小于数据的数量*当前数-小于区间前缀和+大于区间前缀和-大于数据的数量*当前数int n=nums.size();vector<int> ret(n);vector<int> ans(n+1);for(int i=0;i<n;i++) ans[i+1]=ans[i]+nums[i];for(int i=0;i<n;i++){ret[i]=i*nums[i]-ans[i]+ans[n]-ans[i+1]-(n-i-1)*nums[i];}return ret;}
};

2615. 等值距离和

题意:

给定一个整数数组,要求获得一个数组,数组元素由给定数据的下标与相同元素的下标距离和生成

核心思路:

采用哈希表将相同元素的所有下标全部存储

计算下标前缀和,遍历当前元素下标数组,在根据距离和公式计算出结果存储在当前下表内

class Solution {
public:vector<long long> distance(vector<int>& nums) {//题意:给定一个整数数组,要求获得一个数组,数组元素由给定数据的下标与相同元素的下标距离和生成//核心思路:采用哈希表将相同元素的所有下标全部存储//计算下标前缀和,遍历当前元素下标数组,在根据距离和公式计算出结果存储在当前下表内int n=nums.size();unordered_map<int,vector<int>> group;vector<long long> ret(n);for(int i=0;i<n;i++) group[nums[i]].push_back(i);for(auto& [_,a]:group){int m=a.size();vector<long long> s(m+1);for(int i=0;i<m;i++) s[i+1]=s[i]+a[i];for(int i=0;i<m;i++){long long target=a[i];long long l=target*i-s[i];long long r=s[m]-s[i+1]-target*(m-i-1);ret[target]=l+r;}}return ret;}
};

2602. 使数组元素全部相等的最少操作次数

题意:根据操作数组,将原数组数据变成当前数据需要的最少操作次数存放到新数组中

核心思路:

先排序,后根据二分01模型划分小于当前元素区间和大于等于当前元素区间

根据前缀和与距离和公式:计算得出原数据变成当前元素需要的最少操作次数

class Solution {
public://二分01模型,找到大于等于k的第一位,如果不存在默认收敛到最后一位下标int search_01(vector<int>& nums, int k){int l=0,r=nums.size()-1,mid;while(l<r){mid=l+((r-l)>>1);if(nums[mid]>=k) r=mid;else l=mid+1;}return l;}vector<long long> minOperations(vector<int>& nums, vector<int>& queries) { //题意:根据操作数组,将原数组数据变成当前数据需要的最少操作次数存放到新数组中//核心思路:先排序,后根据二分01模型划分小于当前元素区间和大于等于当前元素区间//根据前缀和与距离和公式:计算得出原数据变成当前元素需要的最少操作次数sort(nums.begin(),nums.end());vector<long long> ret(queries.size());vector<long long> ans(nums.size()+1);for(int i=0;i<nums.size();i++) ans[i+1]=ans[i]+nums[i];for(int i=0;i<queries.size();i++){long long idx=search_01(nums,queries[i]);if(nums[idx]<queries[i]) ret[i]=nums.size()*queries[i]-ans[nums.size()];else ret[i]=idx*queries[i]-ans[idx]+ans[nums.size()]-ans[idx]-(nums.size()-idx)*queries[i];}return ret;}
};

2968. 执行操作使频率分数最大

题意:给定一个整数数组和操作次数,每次操作能对数据+1or-1。求在操作次数内改变数据使得让某个元素出现次数最多。

思路:

进行升序排序,进行二分答案10模型搜索。

检查函数:检查是否存在长度为ret的连续子数组,其调整为同一值的总操作数 ≤ k

对于一组有序数,使「所有元素与目标值的绝对值之和最小」的目标值,就是这组数的中位数。

根据给定的ret答案,又根据有序原则采用长度为ret长度的滑动窗口维护,以中位数作为变化数。枚举滑窗中的中位数进行计算窗口内距离和,满足<=k说明当前答案可以满足。

class Solution {
public://检查函数:检查是否存在长度为ret的连续子数组,其调整为同一值的总操作数 ≤ k//对于一组有序数,使「所有元素与目标值的绝对值之和最小」的目标值,就是这组数的中位数。//根据给定的ret答案,又根据有序原则采用长度为ret长度的滑动窗口维护,以中位数作为变化数。枚举滑窗中的中位数进行计算窗口内距离和,满足<=k说明当前答案可以满足bool check(vector<int>& nums, vector<long long>& ans, long long k, int ret) {int n=nums.size();for(int left=0;left<=n-ret;left++){int right=left+ret-1;    //滑窗右边界int mid=(left+right)/2;  //中位数long long target=nums[mid];    //变化数//左侧需要操作数 long long l=target*(mid-left)-(ans[mid]-ans[left]);//右侧需要操作数 long long r=ans[right+1]-ans[mid+1]-target*(right-mid);if(l+r<=k) return true;}return false;}int maxFrequencyScore(vector<int>& nums, long long k) {//题意:给定一个整数数组和操作次数,每次操作能对数据+1or-1。求在操作次数内改变数据使得让某个元素出现次数最多//核心思路:进行升序排序,进行二分答案10模型搜索。if(k==0){int buff=0;unordered_map<int,int> map;for(auto x:nums){map[x]++;buff=max(buff,map[x]);}return buff;}sort(nums.begin(),nums.end());vector<long long> ans(nums.size()+1);int l=1,r=nums.size(),mid;for(int i=0;i<nums.size();i++) ans[i+1]=ans[i]+nums[i];while(l<r){mid=l+((r-l)>>1)+1;if(check(nums,ans,k,mid)) l=mid;else r=mid-1;}return l;}
};


文章转载自:

http://qBiG4KsO.wwznd.cn
http://5utYzOrM.wwznd.cn
http://hsG0cwPc.wwznd.cn
http://cybpDoEc.wwznd.cn
http://6D4x1ZnI.wwznd.cn
http://RaXLFMg3.wwznd.cn
http://EKSPfT9C.wwznd.cn
http://biObdD0t.wwznd.cn
http://qJb7Jpi7.wwznd.cn
http://SopleJrB.wwznd.cn
http://UYFKGXsw.wwznd.cn
http://cE4P1XRh.wwznd.cn
http://LVcnpY85.wwznd.cn
http://15AE14w6.wwznd.cn
http://cV6rlEHE.wwznd.cn
http://cYtBEtxR.wwznd.cn
http://DrvxmPow.wwznd.cn
http://I1NVYy0t.wwznd.cn
http://ve5DSlPM.wwznd.cn
http://Tc8wE1aP.wwznd.cn
http://gLGH3Jvg.wwznd.cn
http://9YwFBns4.wwznd.cn
http://rZljxi1K.wwznd.cn
http://Ck7swJw3.wwznd.cn
http://5auMHZ0b.wwznd.cn
http://CBNwVWYh.wwznd.cn
http://S0IzObCn.wwznd.cn
http://i8K6QW7i.wwznd.cn
http://ZLRmgx0k.wwznd.cn
http://RTCgdQ55.wwznd.cn
http://www.dtcms.com/a/362418.html

相关文章:

  • 基于SQLite的智能图片压缩存储系统:代码解析与实战应用
  • Time-MOE 音频序列分类任务
  • form表达和实体类通常有什么不同
  • C#中的克隆:从理论到实践
  • Elasticsearch Java开发(SpringBoot)
  • 从零开始的云计算生活——第五十六天,临深履薄,kubernetes模块之etcd备份恢复和集群升级指南
  • Prettier代码格式化工具测评:支持JS/TS/Vue多语言,兼容ESLint实现团队代码格式统一
  • 在 PySpark 中解锁窗口函数的力量,实现高级数据转换
  • 什么是Token?——理解自然语言处理中的基本单位
  • 毕业项目推荐:68-基于yolov8/yolov5/yolo11的水稻虫害检测识别系统(Python+卷积神经网络)
  • Python OpenCV图像处理与深度学习: Python OpenCV图像配准入门
  • 深度学习中的数据增强实战:基于PyTorch的图像分类任务优化
  • 云计算学习100天-第43天-cobbler
  • 【linux仓库】万物至简的设计典范:如何用‘文件’这一个概念操纵整个Linux世界?
  • 【数据分享】土地利用shp数据分享-内蒙古
  • Python应用——ffmpeg处理音视频的常见场景
  • 谷歌AdSense套利是什么?怎么做才能赚到钱
  • 安卓QQ闪照获取软件(支持TIM)
  • 各省市信息化项目管理办法中的网络安全等级保护如何规定的?
  • 智能化企业级CRM系统开发实战:飞算JavaAI全流程体验
  • 【音视频】火山引擎实时、低延时拥塞控制算法的优化实践
  • 在 Delphi 5 中获取 Word 文档页数的方法
  • ⸢ 肆 ⸥ ⤳ 默认安全:安全建设方案 ➭ a.信息安全基线
  • 在线宠物用品|基于vue的在线宠物用品交易网站(源码+数据库+文档)
  • 从Web2到Web3:一场重塑数字未来的“静默革命”
  • OpenMMLab 模型部署利器:MMDeploy 详细介绍
  • 小学一到六年级语文/英语/数学作业出题布置网站源码 支持生成PDF和打印
  • Windows 电脑发现老是自动访问外网的域名排障步骤
  • 《微服务协作实战指南:构建全链路稳健性的防御体系》
  • 公司电脑监控软件应该怎么选择?五款超实用的公司电脑监控软件推荐