923. 3Sum With Multiplicity - LeetCode

Question

923. 3Sum With Multiplicityjava

Solution

題目大意:shell

給一個int數組A和一個目標值target,求知足下面兩個條件的組合個數,其中i,j,k分別爲數組的索引數組

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

思路:code

# 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實現:blog

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索引

相關文章
相關標籤/搜索