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

打印给定数组的所有子数组,然后在每个子数组中存储最大整数,以获得所有最大值的和?

鄢英毅
2023-03-14

例如-如果给定数组是:-int[]arr={1,4,8,3};

结果Subarray应该是:

1 , 
1 ,4 , 
1 ,4 ,8 , 
1 ,4 ,8 ,3 ,  

4 , 
4 ,8 , 
4 ,8 ,3 ,  

8 , 
8 ,3 ,
 
3 , 

并且,每个子阵列的最大值为:-1,4,8,8,4,8,8,3,因此所有最大值之和应为:-1 4 8 8 4 8 8 8 8=3=60

要编写Subarray,我可以使用循环来做到这一点:-

{
            for(int j = i ; j <= n ; j++)
            {
                for(int k = i ; k < j ; k++)
                {
                    Console.Write(arr[k] + " ," );                
                    
                }
                
        Console.WriteLine(" " );
            }
        }
        
    }

在此之后,我试图在字典数据结构中存储最大值,但无法找到确切使用字典结构的位置以及如何使用Math.max语句。

IDictionary<int, int> maxValue = new Dictionary<int, int>();

共有1个答案

端木令
2023-03-14

如果你只需要求和,那么它可以用O(n)来求解。因为需要打印子数组,所以这是不可能的。但这也让它变得非常简单(我不知道C#,用您需要的内容替换打印):

int total = 0;
for (int start = 0; start < n; start++) {
    for (int end = start + 1; end <= n; end++) {
        int max = arr[start];
        print(arr[start]);
        for (int i = start + 1; i < end; i++) {
            print(", " + arr[i]);
            if (arr[i] > max)
                max = arr[i];
        }
        total += max;
        print("\n");
    }
    print("\n");
}
print(total); // or whatever you want to do with it

这避免了最后一个逗号,但如果需要,可以将其切换回原来的位置。可读的变量名也很有用。

end不包括在内,我更喜欢这样,因为这样您就可以使用end-start获得子数组的长度。E、 Java的子字符串的工作原理完全相同。

 类似资料:
  • 给定一个数组,编写一个程序以在大小的所有子数组中找到最大 gcd 我的代码: 它是O(N^2),还能再优化吗?

  • 最大乘积子数组给定一个数组包含正整数和负整数,求最大乘积的子数组。例子: 但不能破题找到子数组。

  • 求给定数组的连续子集的最大可能差之和。 我们得到一个由n个非负整数(允许重复元素)组成的数组arr[],求出给定数组中相邻子集的最大差之和。 假设max(s)表示任何子集's'中的最大值,而min(s)表示集合's'中的最小值。我们需要为所有可能的子集找到max(s)-min(s)的总和。 解释: 约束条件: 这是从此处获取的代码,但此代码检查所有可能的子集,而不是连续的子集: 那么如何只得到连续

  • 我一直在练习算法问题,我遇到了这个问题。 给定一个数组(+VE和-VE),我必须找到一个连续的子数组,这样,和可以被任意数K整除,并且该子数组可能是最大和。对于 和,可被k整除的最大和子数组是 ,目前我所能想到的是,每个元素都有两种可能,要么包含在目标子数组中,要么不包含在目标子数组中。但这将是一个指数算法。 编辑:是否有可能在线性时间内解决这个问题。请帮忙