1、暴力法
可以使用三重循环暴力解决,时间复杂度O(n^3)
本题n最大不超过100,因此暴力不会超时
代码示例:
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
int num=0;
for(int i=0;i<nums.size()-2;i++){
for(int j=i+1;j<nums.size()-1;j++){
for(int k=j+1;k<nums.size();k++){
if(nums[i]!=nums[j]&&nums[i]!=nums[k]&&nums[j]!=nums[k]){
num++;
}
}
}
}
return num;
}
};
2、排序法
题目中要求三个数不相同,并且 i < j < k 。
最开始做这个题,我一直头疼 i < j < k 这个条件,觉得只有暴力才能解决。
但是换个角度想,在数组中任取三个数a,b,c,三个数互不相同。不管a,b,c谁前谁后,只要他们三个满足互不相同的条件,就一定存在这个组合。
下标互不相同,数据互不相同,也就是说相同的数据,他们也属于不同的独立个体。
我们可以将数组排序,假设下标[i,j)是相同的数,他的前面有i个和他不一样的数,他的后面有n-j个和他不一样的数,因此把下标[i,j)的数作为中间值,可以组出i*(j-i)*(n-j)个组合。
代码示例:
class Solution {
public:
int unequalTriplets(vector<int>& nums) {
sort(nums.begin(),nums.end());
int i,j,num=0,n=nums.size();
i=0,j=1;
while(1){
while(j<n&&nums[j]==nums[i]){
j++;
}
num=num+i*(j-i)*(n-j);
if(j==n){
break;
}
i=j;
j++;
}
return num;
}
};