【问题标题】:Finding two non-subsequent elements in array which sum is maximal - interview question在数组中找到两个总和最大的非后续元素 - 面试问题
【发布时间】:2020-05-31 20:19:51
【问题描述】:

问题类似于here,除此之外:

  1. 我们正在寻找最大值。
  2. 答案可以包含数组的第一个或最后一个元素(但不能同时包含 - 因为我们认为它们是相邻的)。

我的尝试:

我想用上面链接中RomCoo的相同思路,但是针对这个问题调整一下:

  1. 找出最大的数。
  2. 查找不是第一个邻居的第二大。然后求和。
  3. 计算第一个数字的两个邻居的总和。检查它是否大于第一个总和。 如果不是:取第一个总和,否则取第二个。

我相信步骤 (2) 和 (3) 中的对是唯一可以得到最大和的对,但我无法正式证明这一点。
如果这是正确的,您如何正式证明它?
如果没有,你如何解决?

【问题讨论】:

    标签: arrays algorithm time-complexity max


    【解决方案1】:

    假设我们有两个数字 AB 组成一个更大的总和。 AB(或两者)不能直接与最大数相邻,否则它们会落入 (3)。不失一般性,让我们将其设为A。由于A 与我们的最大数字不相邻,因此B 可以安全地替换为我们最大的数字(如果还没有的话),从而产生更大的总和。因此,要最大,B 必须等于我们最大的数字。同样的逻辑,如果有一个大于A的值不与我们的最大数相邻,那么这个和也不会是最大的,所以A必须是第二大数。这意味着 AB 将属于 (2)。所以,(2) 和 (3) 是我们唯一有效的解决方案。

    【讨论】:

      【解决方案2】:

      我猜这个问题“有点”类似于 1031 LeetCode 问题,你可以在 this link 中看到它:

      Python

      class Solution:
          def maxSumTwoNoOverlap(self, nums, l, m):
              for index in range(1, len(nums)):
                  nums[index] += nums[index - 1]
              largest = nums[l + m - 1]
              l_max, m_max = nums[l - 1], nums[m - 1]
              for index in range(l + m, len(nums)):
                  l_max = max(l_max, nums[index - m] - nums[index - l - m])
                  m_max = max(m_max, nums[index - l] - nums[index - l - m])
                  largest = max(largest, l_max + nums[index] - nums[index - m], m_max + nums[index] - nums[index - l])
      
              return largest
      
      

      Java

      class Solution {
          public int maxSumTwoNoOverlap(int[] nums, int l, int m) {
              for (int index = 1; index < nums.length; index++)
                  nums[index] += nums[index - 1];
      
              int largest = nums[l + m - 1];
              int lMax = nums[l - 1];
              int mMax = nums[m - 1];
      
              for (int index = l + m; index < nums.length; index++) {
                  lMax = Math.max(lMax, nums[index - m] - nums[index - l - m]);
                  mMax = Math.max(mMax, nums[index - l] - nums[index - l - m]);
                  largest = Math.max(largest, Math.max(lMax + nums[index] - nums[index - m], mMax + nums[index] - nums[index - l]));
              }
      
              return largest;
          }
      }
      

      对于您的问题,您必须在扫描阵列时保持至少 2 的距离,以便处理相邻部分。例如,您在扫描时最大化indexindex + 2index - 2index

      参考

      Here is lee215's answer in Java/Python/C++

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 2011-04-13
        相关资源
        最近更新 更多