美文网首页js css html算法
2475. 数组中不等三元组的数目

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

作者: 红树_ | 来源:发表于2023-06-12 12:01 被阅读0次

    LC每日一题,参考2475. 数组中不等三元组的数目,难度分1256。

    题目

    给你一个下标从 0 开始的正整数数组 nums 。请你找出并统计满足下述条件的三元组 (i, j, k) 的数目:

    • 0 <= i < j < k < nums.length
    • nums[i] != nums[j]nums[i] != nums[k]nums[j] != nums[k]

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

    输入: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 。
    输入:nums = [1,1,1,1,1]
    输出:0
    解释:不存在满足条件的三元组,所以返回 0 。
    

    解题思路

    • 枚举:枚举所有情况判断。
    • 排序:排序后不影响结果,枚举中间数的个数。
    • 哈希表:哈希表统计数的个数,然后当成中间数枚举。

    枚举

    class Solution {
        public int unequalTriplets(int[] nums) {
            int ans = 0;
            for(int i = 0; i < nums.length-2; i++) {
                int j = i + 1;
                while(j < nums.length-1) {
                    if(nums[j] != nums[i]) {
                        int k = j + 1;
                        while(k < nums.length){
                            if(nums[k]!=nums[j]&&nums[k]!=nums[i]){
                                ans++;
                            }
                            k++;
                        }
                    }
                    j++;
                }
            }
            return ans;
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n^3),有优化,但还是三重循环,n为数组长度。
    • 空间复杂度:O(1)

    排序

    class Solution {
        public int unequalTriplets(int[] nums) {
            Arrays.sort(nums);
            int res = 0, n = nums.length, i = 0,j = 0;
            while (i < n) {
                while (j < n && nums[j] == nums[i]) {//枚举中间数个数(j-i)                                                                                    
                    j++;
                }
                res += i * (j - i) * (n - j);
                i = j;
            }
            return res;
        }
    }
    

    复杂度分析

    • 时间复杂度:O(nlogn),排序nlogn,枚举n
    • 空间复杂度:O(logn),排序栈空间。

    哈希表

    class Solution {
        public int unequalTriplets(int[] nums) {
            int res = 0, n = nums.length;
            int[] hash = new int[1001];
            for(int i : nums) hash[i]++;
            int a = 0;
            for(int b : hash) {
                if(b > 0) {
                    res += a * b * (n-a-b);
                    a += b;
                }
            }
            return res;
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n),哈希n,枚举n
    • 空间复杂度:O(n),哈希表空间。

    相关文章

      网友评论

        本文标题:2475. 数组中不等三元组的数目

        本文链接:https://www.haomeiwen.com/subject/wvfqydtx.html