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

查找具有指定奇数整数个数的子数组个数

董谦
2023-03-14

给定一个整数数组和一个整数m,我如何找到所有包含m个奇整数的子数组?如果我的问题不充分,下面是对整个问题的更长描述。这个问题有比n^2更快的解决方案吗?下面的解决方案似乎是n^2,我不确定如何进一步优化它。

https://github.com/cem3394/hr-haskell/blob/master/beautifulsubarrays.hs

    static long beautifulSubarrays(int[] a, int m) {
    int sum = 0;
    for (int i = 0; i < a.length; i++){
        for (int j = i, c =0; j < a.length; j++){
            if (a[j] %2 !=0){
                c++;
            }
            if ((c==m) && (z==j)){
                over = true;
                sum++;
                break
            }
            boolean over = false;
            if (over) break;
            for (int z = i, c = 0; z <= j; z++){
                if (a[z]%2 != 0){
                    c++;

                }
                if (c>m){
                    over = true;
                    break;

                }
                if ((c==m) && (z==j)){
                    over = true;
                    sum++;
                    break;
                }
            }
        }
    }
    return sum;


    }

共有1个答案

白泽语
2023-03-14

这是两个指针方法的任务。

制作两个索引-L和R。

将L设为0,并将R从0向右移动,在Od计数器中计数奇数。当Od变为m时,记住R位置为r0。进一步移动R直到遇到新的奇数。

记住L的位置为L0,并递增L,直到满足奇数(如果A[L0]是奇数,则保持不变)。

现在,从L0..L范围开始,到R0..r-1范围结束的所有子数组都正好包含m个奇数。有CNT=(L-L0+1)*(R-R0)这样的子数组:

m=3 
       L0 L        R0           R
i      0  1  2  3  4  5  6  7  8 
A[i]   4  1  3  2  5  6  2  2  3

从0..1开始到4..7结束的所有子数组包含3个奇数,这里有2个索引用于start和4个索引用于end,所以cnt=8

 类似资料:
  • 但是如何在O(n)中解决这个问题呢?

  • 问题内容: 给定一个非负整数数组和一个数字。您需要打印总和等于给定整数的子数组的所有开始和结束索引。 例如 : Explanation : [3, 6] [9], [9,0] These all are the subarrays with their sum equal to 9. 问题答案: 解决这个问题的基本蛮力方法是生成给定数组的所有子数组,然后遍历生成的子数组并计算总和,如果这个总和等于

  • 问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条

  • 我最近遇到一个问题如下。

  • 我想求两个整数之间的偶数奇偶数的个数。以下是我目前所写的内容: 这个很管用。但是,和这两个整数之间的差值可能高达,这意味着类似这样的解决方案是行不通的。是否有一个更有效的,即解决方案来解决这个问题?

  • 我想知道是否存在一种算法来寻找奇数长度数组的中值。显然,我们可以对数组进行排序,取中间值,但理想情况下,我们只需对中间值感兴趣,就可以在算法的时间复杂度方面获得收益。 如果没有这样的算法存在,任何关于如何着手开发这样一个算法的建议将是巨大的。 谢谢