2023-06-13 LeetCode每日一题( 数组中不等三元组的数目)

2023-06-13每日一题

一、题目编号

2475. 数组中不等三元组的数目

二、题目链接

点击跳转到题目位置

三、题目描述

给你一个下标从 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] 。

返回满足上述条件三元组的数目。

提示:

  • 3 <= nums.length <= 100
  • 1 <= nums[i] <= 1000

四、解题代码

class Solution {

public:
    int unequalTriplets(vector<int>& nums) {
        int cnt = 0;
        int n = nums.size();
        for(int i = 0; i < n; ++i){
            for(int j = i + 1; j < n; ++j){
                for(int k = j + 1; k < n; ++k){
                    if(nums[i] != nums[j] && nums[j] != nums[k] && nums[i] != nums[k]){
                        ++cnt;
                    }
                }
            }
        }        
    return cnt;
    }
};
class Solution {
    unordered_map<int, int> hash1;
public:
    int unequalTriplets(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        int cnt = 0;
        for(int i = 0; i < n; ++i){
            hash1[nums[i]] = i;
            while(i != n - 1 && nums[i] == nums[i+1]){
                ++i;
            }
            cnt += (hash1[nums[i]] * (n - 1 - i) * (i - hash1[nums[i]] + 1));   
        }
    return cnt;
    }
};

五、解题思路

(1) 因为数据量很少,所以直接采用暴力枚举的方式来进行解决问题,采用三层循环的方式来暴力解决即可。

(2) 但是采用暴力的方法,时间复杂度自然十分大,显然不能使得我们满意,我们可以通过阅读题目发现,我们满足的是找到三个元素互不相等,那实际上这三个元素可以无视顺序的,即不必满足i < j < k,那么我们先将原来的数组排序再利用哈希表解决问题。列举一个小例子即可理解。例如:1 2 2 2 3。一开始指针i从0开始遍历,遍历到1的时候,自然哈希表中存储1的下标为0,那么这个时候1肯定不可能为中间的数字,故排除。接下来到2,哈希表记录左端下标为1,那么一直遍历到最右端的2,此时最右端的2的下标为i等于3. 那么这个时候以2为中间的三元组个数为 1 * (3 - 1 + 1)* (n - 1 - i)。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)