1726. 同积元组
1.题目介绍
2.题解
2.1 方法一:哈希统计
思路与算法
假设当前给定元组 (a,b,c,d)(a,b,c,d)(a,b,c,d) 满足 a×b=c×d,且此时满足 a≠b≠c≠d,则可以知道该元组可以按照不同顺序组合,组成 8 个不同的元组,
且这个8个元组均满足题目要求:
(a,b,c,d),(a,b,d,c)
(b,a,c,d),(b,a,c,d)
(c,d,a,b),(c,d,b,a)
(d,c,a,b),(d,c,b,a)
也就是说,我们只需要统计出乘积 i1*i2 = n(定值) 的二元组(i1,i2)数量,存入
所以说现在的问题就是如何统计
这里很显然的是个统计出现次数的问题,我们理所当然的想到了哈希表统计
只要组织键值对pair(
代码
class Solution {
public:
int tupleSameProduct(vector<int>& nums) {
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++)
for (int j = i + 1; j < nums.size(); j++){
map[nums[i]*nums[j]]++;
}
int ans = 0;
for (auto &pair : map){
ans += (pair.second) * (pair.second - 1) * 4;
}
return ans;
}
};
复杂度分析
- 时间复杂度:
,双重循环 - 空间复杂度:
,最坏情况下一共有O(n²)种乘积,例如nums全是质数的情况下
2.2 优化?
在官方题解中,我们先用哈希表统计各乘积的出现次数,在最后遍历哈希表计算总个数。这里我们换个思路呢,能否在统计出现次数的时候同时计算总个数呢?这样就可以优化遍历哈希表的循环时间。
答案是肯定可以的,在每次使用一个二元组
这里若是从计算公式来比较,答案中的
class Solution {
public:
int tupleSameProduct(vector<int>& nums) {
int n = nums.size();
unordered_map<int, int> productCount;
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int product = nums[i] * nums[j];
ans += 8 * productCount[product];
productCount[product]++;
}
}
return ans;
}
};
分类:
力扣
, 数据结构与算法 / 哈希算法 / 哈希表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了