leetcode—6241.数组中不等三元组的数目

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;
    }
}

具体看注释就能明白,应该挺明了了,如果没看懂可以评论区留言,或者有更好的想法可以提出,我们一起学习进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值