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

枚举中间位置高级篇

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

核心思路:参考枚举中间位置基础篇-CSDN博客

力扣题单练习(灵神题单中摘取题目)

447. 回旋镖的数量

核心思路:

因给出的点都不相同,所以不会出现枚举到当前点的次数会>=2的情况,枚举每一个点对当前点的距离,从而得出有多少个点到当前点距离一致。

若有 m 个点到点 i 的距离都相同,那么能够组成的回旋镖数量就是 m * (m - 1)。这是因为从 m 个点里选 2 个点进行排列,排列数为 A(m, 2) = m * (m - 1)。

计算从m个点中选2个点进行排列动态(边统计数量)计算:ret+=map[buff]++*2;

class Solution {
public:int numberOfBoomerangs(vector<vector<int>>& points) {//核心思路:因给出的点都不相同,所以不会出现枚举到当前点的次数会>=2的情况,枚举每一个点对当前点的距离,从而得出有多少个点到当前点距离一致。//若有 m 个点到点 i 的距离都相同,那么能够组成的回旋镖数量就是 m * (m - 1)。这是因为从 m 个点里选 2 个点进行排列,排列数为 A(m, 2) = m * (m - 1)。int ret=0;unordered_map<int,int> map;for(auto& x:points){int buff=0;for(auto& y:points){buff=(x[0]-y[0])*(x[0]-y[0])+(x[1]-y[1])*(x[1]-y[1]);//采用的是动态计算的方式,在每次发现新点时,就把新增的组合数量累加到 ret 中。这样一来,当统计完所有点之后,ret 中存储的就是最终的结果。ret+=map[buff]++*2;}map.clear();}return ret;}
};

456. 132 模式

核心思路:

枚举中间位置 j,寻找左侧最小值与右侧次小值。采用自底向上单调递减栈维护右侧,保证满足栈顶大于左侧最小值的同时并且尝试满足小于当前元素

class Solution {
public:bool find132pattern(vector<int>& nums) {//核心思路:枚举中间位置 j,寻找左侧最小值与右侧次小值。采用自底向上单调递减栈维护右侧,保证满足栈顶大于左侧最小值的同时并且尝试满足小于当前元素int n=nums.size();if(n<3) return false;vector<int> left_min(n);left_min[0]=INT_MAX;//维护当前下标前面区间的最小值for(int i=1;i<n;i++) left_min[i]=min(left_min[i-1],nums[i-1]);stack<int> s; //存放可能满足条件的nums[k],维护自底向上递减栈,j实际上就是a[k]左侧第一个严格大于a[k]的元素下标for(int i=n-1;i>=1;i--){int current=nums[i];  //当前元素int buff=left_min[i]; //左侧区间最小值if(buff>=current) continue; //当前位置元素不合法while(!s.empty() && s.top()<=buff) s.pop(); //保证nums[k]>nums[i]if(!s.empty() && s.top()<current) return true; //栈顶元素为可能满足条件的最小元素,如果存在栈顶元素<nums[j]则存在132模式s.push(current);}return false;}
};

3067. 在带权树网络中统计可连接服务器对数目

题意:

给定一个双向路径带权节点数组,要求找到一个节点有至少2条不同的路径并且到路径上的节点的权重可以被signalSpeed整除,统计有多少对满足条件的服务器对组合。

核心思路:

根据给定数组构建路径图,枚举每一个节点,保证有至少两条不同路径。深搜找满足条件的数量,然后进行局部计算组合数量最终得到全部满足条件的组合数量

乘法原理:累加使用过的节点数*当前新统计节点,然后更新使用过的节点数

class Solution {
public://深搜:查找根元素到当前元素的权重可以被signalSpeed整除的节点数量int dfs(vector<vector<pair<int,int>>>& f, int x, int i, int sum, int signalSpeed){int cnt=sum%signalSpeed==0;for(auto &[y,w]:f[x]){if(y!=i) cnt+=dfs(f,y,x,sum+w,signalSpeed);}return cnt;}vector<int> countPairsOfConnectableServers(vector<vector<int>>& edges, int signalSpeed) {//题意:给定一个双向路径带权节点数组,要求找到一个节点有至少2条不同的路径并且到路径上的节点的权重可以被signalSpeed整除,统计有多少对满足条件的服务器对组合。//核心思路:根据给定数组构建路径图,枚举每一个节点,保证有至少两条不同路径。深搜找满足条件的数量,然后进行局部计算组合数量最终得到全部满足条件的组合数量int n=edges.size()+1;vector<vector<pair<int,int>>> f(n+1);//建立路径图for(auto &k:edges){int x=k[0],y=k[1],w=k[2];f[x].push_back({y,w});f[y].push_back({x,w});}vector<int> ret(n);for(int i=0;i<=n;i++){if(f[i].size()<=1) continue;int cnt=0;for(auto &[x,w]:f[i]){int buff=dfs(f,x,i,w,signalSpeed);ret[i]+=buff*cnt;  //用前面统计过局部答案的节点数*新满足条件的节点数获得当前局部答案。保证了最后能算出总组合数cnt+=buff; //前面统计过组合的节点数} }return ret;}
};

灵神枚举中间题单2000分以下题目以完成,后续会更新2000+题目的题解

http://www.lryc.cn/news/604061.html

相关文章:

  • 【C++算法】79.BFS解决FloodFill算法_图像渲染
  • K8s集群两者不同的对外暴露服务的方式
  • 2025年JCR一区新算法-回旋镖气动椭圆优化算法Boomerang Aerodynamic Ellipse(BAE)-附Matlab免费代码
  • 小程序发票合并功能升级!发票夹直接选,操作更便捷
  • Python爬虫03_Requests破解百度翻译
  • 三步给小智ESP32S3智能语音硬件接入小程序打通MCP服务
  • ClickHouse MergeTree引擎:从核心架构到三级索引实战
  • 数字ic后端设计从入门到精通13(含fusion compiler, tcl教学)全定制版图设计
  • 通过双网口实现两台设备共享网络与文件传输
  • python线性回归:从原理到实战应用
  • 负载均衡、算法/策略
  • 【iOS】类扩展与关联对象
  • 深入解析RocksDB的MVCC和LSM Tree level
  • Vulnhub-NAPPING: 1.0.1靶机
  • 汉得班翎流程平台V1.20.0正式发布:AI智慧赋能,集成效率跃升!
  • ZKmall开源商城架构工具链:Docker、k8s 部署与管理技巧
  • 基于三台主机搭建 Web 服务环境:Nginx、NFS 与 DNS 配置全流程
  • 机械学习--线性回归---三个小案例
  • Kun_Tools(全能文档工具)V0.4.6 便携版
  • 2025年中科院与JCR期刊分区深度对比(第一期):TON中科院分区3区不变,JCR分区升至Q1;TOSEM重回中科院1区!
  • I2C 与 SMBus:同根同源,各有千秋
  • 学习Python中Selenium模块的基本用法(3:下载浏览器驱动续)
  • 美国股市高频tick级分时交易数据解码与订单簿及交易指令分析
  • 使用 Spring AI Alibaba MCP 结合 Nacos 实现企业级智能体应用
  • win10 环境删除文件提示文件被使用无法删除怎么办?
  • Aura_P41_PXX GameplayEffect
  • iOS仿写 —— 计算器
  • Python包架构设计与模式应用:构建可扩展的企业级组件
  • 车载诊断架构 --- 关于诊断时间参数P4的浅析
  • ABP VNext + GraphQL Federation:跨微服务联合 Schema 分层