我最近在一次编码面试中遇到了这个问题。问题如下:
给定一个包含n个数字和k个数字的数组A[],计算不同子数组的总数,使得每个子数组最多包含k个奇数元素。
1 <= n <= 1000
1 <= A[i] <= 250
1 <= k <= n
我使用DP方法来解决问题,但我的解决方案没有照顾到独特的
部分。
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.
我们可以迭代所有子数组并存储有效子数组的哈希值。时间复杂度为 O((n^2)*log(n)),
内存复杂度为 O(n^2)。内存复杂度为 O(n^2)。
int distinctSubArraysWithAtmostKOddElements(vector<int> a, int k)
{
set<unsigned long long int> hashes;
int prime = 163;
for(int i = 0 ; i < a.size() ; i++)
{
int oddNow = 0;
unsigned long long int hashNow = 0;
for(int j = i ; j < a.size() ; j++)
{
hashNow = hashNow * prime + a[j];
if( a[j] % 2) oddNow++;
if(oddNow <= k)
hashes.insert(hashNow);
else
break;
}
}
return hashes.size();
}
我想找到一种算法来计算阵列中不同子阵列的数量。 例如,在 A = [1,2,1,2] 的情况下,不同子数组的数量为 7: 在B=[1,1,1]的情况下,不同子阵列的数量为3: 子数组是数组的连续子序列或片段。不同意味着内容不同;例如: 来自A[0:1]的[1]和来自A[2:3]的[1]不是不同的。 类似地: B[0:1],B[1:2],B[2:3]并不明显。
给定一个n个正整数的序列,我们需要计算其和可被k整除的连续子序列。 约束条件:N最多为10^6,每个元素最多为10 ^9,K最多为100 示例:设N=5,K=3,数组为1 2 3 4 1 这里的答案是4 说明:存在4个子序列,其和可被3整除,它们是: 我的尝试是: 但显然它的方法很差。对于这个问题,他们有更好的方法吗?请帮帮忙。 完整问题:https://www.hackerrank.com/co
问题内容: 我是Oracle的新手。我有一个Oracle表有三列:,和。在第三列中的行具有值,或 。 我想使用count运行查询,以显示可维修的数量,正在维修的数量,针对每个项目类别的谴责数量。 我想运行类似的东西: 我无法在计数内运行内部查询。 这是我希望结果集看起来像的样子: 问题答案: 您可以在COUNT函数中使用CASE或DECODE语句。 输出:
我会跟踪哪些人登录到我们的本地服务器,如下面的数据库所示。 我的数据库结构是:
你有一个整数数组。您必须找到子阵列的数量,该数量意味着(这些元素的总和除以这些元素的计数)舍入为零。我已经用O(n^2)时间解决了这个问题,但效率不够。有办法吗?
给定一个(未排序的)数组S和一些整数k,找到对的数量i, j使得S的范围[i... j] 我在一次采访中收到了这个问题,经过排序后只能得出一个O(nlogn)解。但是,有人告诉我有一个O(n)解。有什么想法吗?