当前位置: 首页 > 知识库问答 >
问题:

计数不同子阵列的数目

洪楷
2023-03-14

我最近在一次编码面试中遇到了这个问题。问题如下:

给定一个包含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.

共有1个答案

赫连黎昕
2023-03-14

我们可以迭代所有子数组并存储有效子数组的哈希值。时间复杂度为 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)解。有什么想法吗?