zoukankan      html  css  js  c++  java
  • 923. 3Sum With Multiplicity

    Question

    923. 3Sum With Multiplicity

    Solution

    题目大意:

    给一个int数组A和一个目标值target,求满足下面两个条件的组合个数,其中i,j,k分别为数组的索引

    1. i<j<k
    2. target = A[i] + A[j] + A[k]

    思路:

    # step1 统计数组中每个元素出现的次数
    一个元素I出现的次数记为count(I)
    
    # step2 分类
    记:I=A[i], J=A[j], K=A[k], C(count(I),3) 表示从count(I)个数中取3个的组合数
    I=J=K     C(count(I), 3)
    I=J!=K    C(count(I), 2) * count(K)
    I!=J=K    count(I) * C(count(K), 2)
    I!=J!=K   count(I) * count(J) * count(K)
    
    # 复杂度
    Time complexity: O(n + target^2)
    Space complexity: O(100)
    

    下面是参考视频中的截图,其中的i,j,k是数而不是index

    Java实现:

    public int threeSumMulti(int[] A, int target) {
        int MOD = 1_000_000_007; // 因为最大数为10^9+7
    
        // 计算数组中不同元素出现的个数   因为 0 <= A[i] <=100
        long[] c = new long[101]; // 定义成long,在计算中不用转换
        for (int a : A) c[a]++;
    
        long ans = 0;
        for (int i = 0; i <= target; i++) {
            for (int j = i; j <= target; j++) {
                int k = target - i - j;
                if (k < 0 || k >= c.length || k < j) continue;
                if (c[i] == 0 || c[j] == 0 || c[k] == 0) continue;
                if (i ==j && j == k) {
                    ans += (c[i] - 2) * (c[i] - 1) * c[i] / 6;
                } else if (i ==j && j != k) {
                    ans += c[i] * (c[i] - 1) / 2 * c[k];
                } else if (i != j && j == k) {
                    ans += c[i] * (c[j] - 1) * c[j] / 2;
                } else {
                    ans += c[i] * c[j] * c[k];
                }
                ans %= MOD;
            }
        }
        return (int)ans;
    }
    

    Reference

    花花酱 LeetCode 923. 3Sum With Multiplicity - 刷题找工作 EP227

  • 相关阅读:
    Django + Uwsgi + Nginx 的概念
    ubantu+nginx+uwsgi+django部署
    FileZilla以root用户登录Linux
    全文检索django-haystack+jieba+whoosh
    七牛云上传视频
    JWT登录与多方式登录
    vue绑定用户页面
    绑定微博用户接口
    vue微博回调空页面
    微博回调接口
  • 原文地址:https://www.cnblogs.com/okokabcd/p/9832343.html
Copyright © 2011-2022 走看看