LeetCode刷题日记 打卡2022/11/21
示例 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 <= 100
1 <= nums[i] <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-unequal-triplets-in-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这是一道比较简单的题目,起初使用暴力算法遍历就能过,但对于自己的算法提升没有丝毫的帮助。参考道哥刷题的题解,发现可以通过排列组合快速处理。一开始看到也是有些不太理解(数学不太好,没有反应过来),后来看了具体的解释才恍然大悟。发现其实很简单,只是没想到这种思路,没办法,暴力杯打多了总是定向思维,也不会想着去通过改良算法去提升。下面是我暴力解题和通过算法去处理的结果,差距天壤之别。
第一次暴力破解就不献丑了,附上最后一次的提交代码。
class Solution {
public int unequalTriplets(int[] nums) {
int[] ant = new int[10001];
int n=nums.length;
int answ=n*(n-1)*(n-2)/6;//C3,n(n个选三个),总可能数
for (int i : nums) ++ant[i];
for (int i = 1; i < 1001; i++) {
int x=ant[i];
if (x==0) continue;
/*
不满足情况只有两种
1.相同数大于等于3,选了3个重复数
2.相同数大于等于2,选了2个重复数
*/
int a=x<3?0:x*(x-1)*(x-2)/6;//重复个数
int b=x<2?0:(n-x)*x*(x-1)/2;//避坑:不要忘记乘上n-x
answ-=a+b;
}
return answ;
}
}
具体看注释就能明白,应该挺明了了,如果没看懂可以评论区留言,或者有更好的想法可以提出,我们一起学习进步。