【每日一题Day236】LC2475数组中不等三元组的数目

简介: 【每日一题Day236】LC2475数组中不等三元组的数目

数组中不等三元组的数目【LC2475】

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

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

暴力
  • 思路:使用三个指针暴力搜寻合法的位置
  • 实现
class Solution {
    public int unequalTriplets(int[] nums) {
        int len = nums.length;
        int res = 0;
        if (len < 3){
            return res;
        }
        int i = 0;
        while (i < len - 2){
            int j = i + 1;
            while (j < len - 1){
                if (nums[i] != nums[j]){
                    int k = j + 1;
                     while (k < len){
                        if (nums[j] != nums[k] && nums[i] != nums[k]){
                            res++;                            
                        }
                        k++;
                    }
                }
                j++;
            }
            i++;
        }
        return res;
    }
}

image.png

image.png

class Solution {
    public int unequalTriplets(int[] nums) {
        Arrays.sort(nums);
        int l = 0;
        int ans = 0;
        int len = nums.length;
        while (l < len ){
            int r = l + 1;// 寻找与nums[l]不相等的第一个数
            while (r < len && nums[l] == nums[r]){
                r++;
            }
            ans += l  * (r - l) * ( len - r);
            l = r;            
        }
        return ans;
    }
}

image.png

哈希表
  • 思路:由于三元组中元素的数值的顺序是不重要的,只需要值不相等既可,因此可以直接用哈希表统计num出现的次数,然后遍历哈希表,假设
  • 在其之前遍历的元素有a个
  • 等于其的元素有b个
  • 在其之后遍历的元素有c个

那么,根据组合原理,该元素对结果的贡献为abc

实现

class Solution {
    public int unequalTriplets(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        int ans = 0;
        int len = nums.length;
        for (int i = 0; i < len; i++){
            map.put(nums[i], map.getOrDefault(nums[i],0) + 1);
        }
        int l = 0;
        int r = len;
        for (Map.Entry<Integer,Integer> node : map.entrySet()){
            int count = node.getValue();
            r -= count;
            ans += l * count * r;
            l += count;
        }
        return ans;
    }
}

image.png


目录
相关文章
|
7月前
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
【每日一题Day357】LC1155掷骰子等于目标和的方法数 | dp
58 0
|
7月前
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
30 0
|
7月前
【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表
【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表
55 0
|
7月前
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
40 0
|
7月前
每日一题(最大连续1的个数,完全数计算)
每日一题(最大连续1的个数,完全数计算)
32 0
|
7月前
【每日一题Day358】LC2698求一个整数的惩罚数 | 递归
【每日一题Day358】LC2698求一个整数的惩罚数 | 递归
53 0
|
7月前
【每日一题Day317】LC2605从两个数字数组里生成最小数字 | 哈希表
【每日一题Day317】LC2605从两个数字数组里生成最小数字 | 哈希表
42 0
|
7月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
30 0
|
7月前
【每日一题Day299】LC2235两整数相加
【每日一题Day299】LC2235两整数相加
31 0
|
7月前
【每日一题Day234】LC1171从链表中删去总和值为零的连续节点 | 链表模拟 哈希表+前缀和
【每日一题Day234】LC1171从链表中删去总和值为零的连续节点 | 链表模拟 哈希表+前缀和
42 0