923. 3Sum With Multiplicityjava
題目大意:shell
給一個int數組A和一個目標值target,求知足下面兩個條件的組合個數,其中i,j,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; }