2023-06-13每日一题
一、题目编号
2475. 数组中不等三元组的数目
二、题目链接
三、题目描述
给你一个下标从 0 开始的正整数数组 nums 。请你找出并统计满足下述条件的三元组 (i, j, k) 的数目:
- 0 <= i < j < k < nums.length
- nums[i]、nums[j] 和 nums[k] 两两不同 。
换句话说:nums[i] != nums[j]、nums[i] != nums[k] 且 nums[j] != nums[k] 。
返回满足上述条件三元组的数目。
提示:
- 3 <= nums.length <= 100
- 1 <= nums[i] <= 1000
四、解题代码
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
int cnt = 0;
int n = nums.size();
for(int i = 0; i < n; ++i){
for(int j = i + 1; j < n; ++j){
for(int k = j + 1; k < n; ++k){
if(nums[i] != nums[j] && nums[j] != nums[k] && nums[i] != nums[k]){
++cnt;
}
}
}
}
return cnt;
}
};
class Solution {
unordered_map<int, int> hash1;
public:
int unequalTriplets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
int cnt = 0;
for(int i = 0; i < n; ++i){
hash1[nums[i]] = i;
while(i != n - 1 && nums[i] == nums[i+1]){
++i;
}
cnt += (hash1[nums[i]] * (n - 1 - i) * (i - hash1[nums[i]] + 1));
}
return cnt;
}
};
五、解题思路
(1) 因为数据量很少,所以直接采用暴力枚举的方式来进行解决问题,采用三层循环的方式来暴力解决即可。
(2) 但是采用暴力的方法,时间复杂度自然十分大,显然不能使得我们满意,我们可以通过阅读题目发现,我们满足的是找到三个元素互不相等,那实际上这三个元素可以无视顺序的,即不必满足i < j < k,那么我们先将原来的数组排序再利用哈希表解决问题。列举一个小例子即可理解。例如:1 2 2 2 3。一开始指针i从0开始遍历,遍历到1的时候,自然哈希表中存储1的下标为0,那么这个时候1肯定不可能为中间的数字,故排除。接下来到2,哈希表记录左端下标为1,那么一直遍历到最右端的2,此时最右端的2的下标为i等于3. 那么这个时候以2为中间的三元组个数为 1 * (3 - 1 + 1)* (n - 1 - i)。