Я недавно сталкивался с этим вопросом в одном из интервью по кодированию.Вопрос в следующем:
Учитывая массив A [] из n чисел и числа k, подсчитайте общее количество различных подмассивов, чтобы каждый подмассив содержал не более k нечетных элементов .
1 <= n <= 1000
1 <= A[i] <= 250
1 <= k <= n
Я использовал подход DP для решения проблемы, но мое решение не учитывает деталь distinct
.
public int distinctSubArraysWithAtmostKOddElements(int[] a, int k) {
int l = a.length;
int[][] dp = new int[k + 1][l];
for (int j = 0; j < l; j++) {
dp[0][j] = a[j] % 2 == 0 ? 1 : 0;
}
for (int i = 1; i <= k; i++) {
dp[i][0] = 1;
}
for (int j = 1; j <= k; j++) {
for (int i = 1; i < l; i++) {
if (a[i] % 2 == 0) {
dp[j][i] = Math.max(dp[j - 1][i], 1 + Math.max(dp[j - 1][i - 1], dp[j][i - 1]));
} else {
dp[j][i] = Math.max(dp[j - 1][i], 1 + dp[j - 1][i - 1]);
}
}
}
int tot = 0;
for (int i = 0; i < l; i++) {
tot += dp[k][i];
}
return tot;
}
Мое решение работает в O(nk) время и пространство.
Как я могу заботиться о различимости?Существует ли математическая формула, которая решает эту проблему?
Редактировать:
Например 1:
A[] = {2,1,2,3} and k = 1
Distinct Subarrays are: {2}, {2,1}, {1}, {1,2}, {2,1,2}, {3}, {2,3}
So answer is 7.
Пример 2:
A[] = {1,1,1} and k = 2
Distinct Subarrays are: {1}, {1,1}
So answer is 2.
Например, 3:
A[] = {1,2,3} and k = 1
Distinct Subarrays are: {1}, {2}, {3}, {1,2}, {2,3}
So answer is 5.