【问题标题】:Find numbers of subarray of an array whose sum is divided by 3查找总和除以 3 的数组的子数组的数量
【发布时间】:2015-01-03 17:13:27
【问题描述】:

我陷入了一个算法问题。请为以下问题推荐一些有效的算法

问题是

查找总和可被给定数整除的子数组的数量(在 0

我的做法:

Input:    0  5  3  8  2  1
Sum:   0  0  5  8 16 18 19
Mod 3: 0  0  2  2  1  0  1

没有。选择 0 、 1 或 2 的方法有 NC2

问题:是否要求我在某个范围(即从 2 到 5)之间进行选择,因此数组将变为:

3  8  2  1

我是否必须重新计算总和和 Mod,否则原始 MOd 数组会给我一个正确答案

第二个问题:如果我更改一个元素,即 8 is change to 11,效果如何
对于上述问题,我正在考虑使用 BIT dp[4][Max. Element] if mod is 0 update dp[0] if 1 update dp[1] so on 如果索引处的 VALue 发生变化,如何更新

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:

    看看这个:

    这个子程序找到其和除以 3 的最大子数组。 它只在阵列上运行一次,没有额外的空间。 这里是c++代码:

    int largest_3_divider_subarray(int* a, int len){
    
    int cum_sum            =  0;    
    int index_of_first_one = -1;
    int index_of_first_two = -1;
    int absolute_maximal   =  0;
    int current_maximal    =  0;
    bool flag1 = 1, flag2 = 1;
    
    for(int i = 0; i < len; ++i){
    
        cum_sum += a[i];
    
        switch (cum_sum%3)
        {
        case 1:
            if(flag1){
                index_of_first_one = i;
                flag1 = 0;
            }else       
                current_maximal = i - index_of_first_one;
            break;
    
        case 2:
            if(flag2){
                index_of_first_two = i;
                flag2 = 0;
            }else
                current_maximal = i - index_of_first_two;
            break;
    
        case 0:
            current_maximal = i;
        }
    
        if(current_maximal > absolute_maximal)
            absolute_maximal = current_maximal;
    }
    
    return absolute_maximal + 1;
    

    }

    int main() {

    int A[]= {6,8,-2,0,9,13,1};
    int k = largest_3_divider_subarray(A,7);
    
    
    return 0;
    

    }

    【讨论】:

    • 这能解决 OP 的问题吗?我认为他们想知道总和为 0 mod 3 的不同子数组的数量,而不是其中最长的。
    【解决方案2】:

    这可能是一个正在运行的比赛问题,但是有一个 dp 方法可以解决这个问题。如果要解决跑步比赛问题,则需要将其与段树结合起来。

    基本思路:

    • 注意以当前字符/数字结尾的子字符串/子数组的数字总和的 %3 值。
    • 然后将其作为子问题,并尝试使用先前获得的数据获取以具有不同模值的下一个字符/数字结尾的子数组的数量。

    (dp 的特性:我们尝试解决一个子问题,然后使用获得的值我们尝试解决更大实例的子问题)。

    如果你想解决codechef中的跑步比赛问题,你只需要结合segment tree就可以了

    段树有一些不错的教程

    【讨论】:

      【解决方案3】:
      public static int largest_3_divider_subarray(int a[]){
      
        int cum_sum            =  0;    
        int index_of_first_one = -1;
        int index_of_first_two = -1;
        int absolute_maximal   =  0;
        int current_maximal    =  0;
        boolean flag1 = true, flag2 = true;
      
        for(int i = 0; i < a.length; ++i){
      
           cum_sum += a[i];
      
           switch ((cum_sum%3))
           {
               case 1:
               case -2:
                  if(flag1){
                   index_of_first_one = i;
                   flag1 = false;
                  }else       
                      current_maximal = i - index_of_first_one;
                      break;
      
                case 2:
                case -1:
                  if(flag2){
                      index_of_first_two = i;
                      flag2 = false;
                  }else
                      current_maximal = i - index_of_first_two;
                      break;
      
                case 0:
                      current_maximal = i+1;
                  }
      
          if(current_maximal > absolute_maximal)
          absolute_maximal = current_maximal;
      }
      
      return absolute_maximal ;
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-01
        • 1970-01-01
        • 2022-01-05
        • 2020-06-26
        • 2017-08-22
        • 2012-10-16
        • 2023-01-25
        • 2016-10-09
        • 2012-07-31
        相关资源
        最近更新 更多