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

枚举中间位置高级篇

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

核心思路:参考枚举中间位置基础篇-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.xdnf.cn/news/16731.html

相关文章:

  • UE5 打包Windows平台时无法找到SDK的解决方法
  • 远程Qt Creator中文输入解决方案
  • Flex布局面试常考的场景题目
  • python中的 @dataclass
  • 第4章唯一ID生成器——4.5 美团点评开源方案Leaf
  • 【22】C# 窗体应用WinForm ——定时器Timer属性、方法、实例应用,定时切换画面
  • 破解企业无公网 IP 难题:可行路径与实现方法?
  • 【MySQL基础篇】:MySQL表的约束常用类型以及实战示例
  • 【C#获取高精度时间】
  • Prometheus + Grafana + Micrometer 监控方案详解
  • JVM指令集
  • 重生之我在暑假学习微服务第四天《Docker-下篇》
  • 【学习路线】游戏开发大师之路:从编程基础到独立游戏制作
  • uniapp开发微信小程序(新旧版本对比:授权手机号登录、授权头像和昵称)
  • Python与Spark
  • 【深度学习】独热编码(One-Hot Encoding)
  • C++_红黑树树
  • CMake 完全实战指南:从入门到精通
  • 使用redis 作为消息队列时, 如何保证消息的可靠性
  • Leetcode 08 java
  • 鸿蒙Harmony-自定义List组件,解决List组件手势滑动点击卡住问题
  • Apache Ignite 的分布式队列(IgniteQueue)和分布式集合(IgniteSet)的介绍
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 0基礎網站開發技術教學(一) --(前端篇)--
  • 《Java 程序设计》第 9 章 - 内部类、枚举和注解
  • Java07--面向对象
  • 自动调优 vLLM 服务器参数(实战指南)
  • 如何用USRP捕获手机信号波形(下)协议分析
  • 怎么理解使用MQ解决分布式事务 -- 以kafka为例
  • 小白学OpenCV系列1-图像处理基本操作