开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个下标从 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] 。 返回满足上述条件三元组的数目。
示例 1:
输入:nums = [4,4,2,4,3]
输出:3
解释:下面列出的三元组均满足题目条件:
- (0, 2, 4) 因为 4 != 2 != 3
- (1, 2, 4) 因为 4 != 2 != 3
- (2, 3, 4) 因为 2 != 4 != 3
共计 3 个三元组,返回 3 。
注意 (2, 0, 4) 不是有效的三元组,因为 2 > 0 。
示例 2:
输入: nums = [1,1,1,1,1]
输出: 0
解释: 不存在满足条件的三元组,所以返回 0 。
提示:
3 <= nums.length <= 1001 <= nums[i] <= 1000
二、思路分析
这是一道简单难度的题目,也是昨天周赛的第一道题目,我开始就觉得这道题似曾相识,尝试用双指针的方法去做,后面看评论区解题,发现这一题没有显示时间复杂度,所以可以直接用三重for循环快速通过。然而即使是看似简单的三重for循环,也把我难倒了,又看了评论的解法,才知道自己踩了坑。需要注意的是三元组为数组下标的组合。
三、AC代码
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
int count=0;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
for(int k=j+1;k<nums.size();k++){
if(nums[i]!=nums[k]&&nums[j]!=nums[k]&&nums[j]!=nums[i]) count++;
}
}
}
return count;
}
};
提交排名
四、总结
在平时的训练中,我们可以考虑用简便的方法,但在竞赛中,我们更应该注重的是在满足题目所给的条件的情况下用最快的时间解出题目。