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

如何从所有可能的子阵列中找到最小和次最小元素的最大和

漆雕彬彬
2023-03-14

给定一个数组,求从所有可能的子数组中选择的最小元素和次最小元素的最大和。更正式地说,如果我们写出大小为

Examples: Input : arr[] = [4, 3, 1, 5, 6] Output : 11`

Subarrays with smallest and second smallest are,
[4, 3]        smallest = 3    second smallest = 4
[4, 3, 1]    smallest = 1    second smallest = 3
[4, 3, 1, 5]    smallest = 1    second smallest = 3
[4, 3, 1, 5, 6]    smallest = 1    second smallest = 3
[3, 1]         smallest = 1    second smallest = 3
[3, 1, 5]     smallest = 1    second smallest = 3
[3, 1, 5, 6]    smallest = 1    second smallest = 3
[1, 5]        smallest = 1    second smallest = 5
[1, 5, 6]    smallest = 1    second smallest = 5
[5, 6]         smallest = 5    second smallest = 6
Maximum sum among all above choices is, 5 + 6 = 11

这个问题是关于GFG的,但我不理解它的解释。

请任何人给出它在O(n)时间复杂度下的解。

共有2个答案

暨曾笑
2023-03-14

首先你不明白这个问题!如果你仔细考虑所有的子数组,最后你可以看到所有的子数组都是相关的;换句话说,我们正在考虑以前的子数组当前子数组的结果

Subarrays with smallest and second smallest are,
[4, 3]        smallest = 3    second smallest = 4
[4, 3, 1]    smallest = 1    second smallest = 3
[4, 3, 1, 5]    smallest = 1    second smallest = 3
[4, 3, 1, 5, 6]    smallest = 1    second smallest = 3
[3, 1]         smallest = 1    second smallest = 3
[3, 1, 5]     smallest = 1    second smallest = 3
[3, 1, 5, 6]    smallest = 1    second smallest = 3
[1, 5]        smallest = 1    second smallest = 5
[1, 5, 6]    smallest = 1    second smallest = 5
[5, 6]         smallest = 5    second smallest = 6
Maximum sum among all above choices is, 5 + 6 = 11

从每个子数组:

1. we are taking the current largest value and if it is greater than previous largest we are replacing, and previous largest eventually becomes second most largest.
2. we are repeating this steps for every possible subarray (increasing in terms of index).
3. and at the end you can see, we are taking first-most and second-most value from the array.

因此,检查数组中的每一对值可以降低总体复杂性

int res = arr[0] + arr[1];  //O(1)+O(1)
for (int i=1; i<N-1; i++)   // O(N-2) -> O(N)
   res = max(res, arr[i] + arr[i+1]); //O(1)+O(1)+O(1)

总体复杂度:O(N)。

茹高义
2023-03-14

问题是:如果我们只看长度为2的所有子阵列,为什么我们总是保证找到最大和?

为了回答这个问题,让我们假设我们有一些数组A。在该数组中,显然,必须至少有一个子数组S,其中最小和第二小的元素,让我们称之为X和Y,求和我们的结果。

如果这两个元素已经相邻,这意味着有一个长度为2的a的子阵列将包含X和Y,因此,如果我们只查看长度为2的所有子阵列,我们将找到X和Y并输出X Y。

然而,问题是:有没有办法让我们的两个元素X和Y在S中不成为“邻居”?好吧,如果是这样的话,显然需要其他号码,我们叫它们Z0,Z1。。。,在他们之间。

显然,对于所有这些值,它必须保持Zi

如果任何一个Zi大于X或Y,这就意味着a的子阵列将只包括这个更大的Zi加上它的邻居。在这个子数组中,Zi和它的邻居将是最小和次最小的元素,它们的总和将大于X Y,因此我们的子数组S不会是给出我们的解的子数组。这与我们对S的定义相矛盾,所以这不可能发生。

所以,所有的Zi不能小于X或Y,也不能大于X或Y。这只剩下一种可能性:对于X==Y,它们都可以相等。但是,在这种情况下,我们显然还有一个长度为2的子数组,它总结了我们的正确结果。

因此,在所有情况下,我们都可以证明必须有一个长度为2的子数组,其中两个元素的总和就是我们的结果,这就是为什么该算法是正确的。

 类似资料:
  • 我看到一个问题,要求它找到所有相邻子阵列的最小值。例如,对于数组A=[1,2,3],答案将是一个包含[1,2,3,1,2,1]的数组B<怎么做- 我所做的是,构建了一个段树,但是它不包含所有连续子数组的最小值。 我也不认为我可以使用“脱钩”,因为我不必在特定长度的子数组中找到最小值。 那么,我如何获得所有连续子阵列(B阵列)的最小值?

  • 本文向大家介绍C ++中所有可能的子阵列中可能的最小LCM和GCD,包括了C ++中所有可能的子阵列中可能的最小LCM和GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个大小为N的数组arr。它有N个正数。我们必须找到所有可能的子数组的最小元素。假设数组为{2,66,14,521},则最小LCM为2,GCD为1。 我们将使用贪婪的方法解决此问题。如果减少元素数量,则LCM会减少,而如果

  • 我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否

  • 有这么多参考文献来寻找大小为k的所有子阵列的最小值/最大值,但是如何以最好的可能方式找到第n个最大值/最小值。如果我们必须找到子阵列的最小值/最大值,那么我们可以使用具有线性时间复杂度的deque解决方案。但是对于第n分钟/最长时间,我无法找到解决方案。 注意:n 例如:arr = {7,1,4,20,11,17,15} n=2,k=4 输出:4,4,11,15

  • 本文向大家介绍JavaScript 查找最小或最大元素,包括了JavaScript 查找最小或最大元素的使用技巧和注意事项,需要的朋友参考一下 示例 如果您的数组或类似数组的对象是numeric,也就是说,如果它的所有元素都是数字,则可以使用Math.min.apply或作为第一个参数Math.max.apply传递null,而将数组作为第二个参数传递。 6 在ES6中,可以使用...运算符扩展数

  • 我试图找到矩阵中每列的最小值和最大值,但我当前的代码运行不正确。我试图把最小值放在一个新矩阵的第一行,最大值放在下一行,并对每一列这样做。任何帮助都将不胜感激,谢谢!