开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
题目要求
给你一个下标从 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
思路分析
今天的题目是一道简单题,我们可以先了解一下题意,题目会给我们一个数组,我们需要在数组中找到满足条件的三元组,并统计其数量,三元组的具体条件为: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,所以我们可以直接三重遍历来找出满足条件的答案,三重遍历的时间复杂度为O(n^3),因为数据范围比较小,最大为100,所以O(n^3)最多也就需要计算100 ^ 3 = 1000000次,这时间复杂度也并不会超过,所以我们可以直接采用这样的做法来解答这道题目。
那么这道题可以用双指针的方法来做吗?我思考了一阵后认为是不行的,因为这里的数组是无序的,且我们需要满足条件0 <= i < j < k < nums.length,也就是说我们不能先排序再计算,所以我认为无法使用双指针算法来解答这道题目。
AC代码
/**
* @param {number[]} nums
* @return {number}
*/
var unequalTriplets = function(nums) {
let res = 0;
for(let i = 0; i < nums.length; i++){
for(let j = i + 1; j < nums.length; j++){
for(let k = j + 1; k < nums.length; k++){
if(nums[i] != nums[j] && nums[i] != nums[k] && nums[j] != nums[k]) res++;
}
}
}
return res;
};
说在最后
本人为算法业余爱好者,如果上面分享有错误的地方,欢迎指出,感激不尽。