【问题标题】:Minimise the smallest positive integer not present in merged array最小化合并数组中不存在的最小正整数
【发布时间】:2022-01-20 04:54:08
【问题描述】:

我在一次在线面试测试中得到了这个问题。我无法让所有的测试用例都通过。我正在寻找如何解决它。

给定两个数组AB,每个数组由N 整数组成。我们希望将它们合并到数组C 中,这样对于每个索引K(从0 到N - 1),C[K] 可以是A[K]B[K]。例如,数组A = [1, 2, 4, 3]B = [1, 3, 2, 3] 可以通过以下任意一种方式合并:

[1,2,4,3] [1,3,4,3] [1,2,2,3] [1,3,2,3]

我们的目标是获得C,使得C 中不存在的最小正整数尽可能小。在我们示例的排列中,该值将分别为5244。所以,我们的解决方案是第二种排列,结果是2

更多示例:

  1. A = [1, 2, 4, 3]B = [1, 3, 2, 3],答案:2
  2. A = [3, 2, 1, 6, 5]B = [4, 2, 1, 3, 3],答案:3我们可以创建 C = [4, 2, 1, 6, 5]
  3. A = [1, 2]B = [1, 2],答案:3 因为C = [1, 2] 是唯一可能的排列。

约束:

  • 输入数组大小,1 < N < 10^5
  • 0 < A[i], B[i] <= 10^5
  • 输入数组大小相等。

我的方法:

我贪婪地比较了两个数组并将两个元素中较大的一个推入名为 C 的新向量中。然后对其进行迭代以找到第一个丢失的正元素。我想将两个元素的最大值推到答案的逻辑中存在一些缺陷。一些隐藏的测试用例失败了。

伪代码:

input A,B
for i = 0 to N-1:
    C[i] = max(A[i], B[i])
sort(C)
h = 0
for i = 0 to N-1:
    if C[i] - h > 1:
        return h+1
    h = C[i]
return h+1

【问题讨论】:

  • 嘿,这不是我的作业,我是一位经验丰富的 SDE。我在一次在线面试评估中得到了这个问题,但无法正确回答。在这里询问如何解决这个问题。
  • 听起来你写了一个解决方案,这个解决方案有一些问题。也许您想发布该代码并解释您遇到了什么问题。
  • @khelwood,我贪婪地比较了两个数组并将两个元素中较大的一个推入名为 C 的新向量中。然后对其进行迭代以找到第一个丢失的正元素。我想将两个元素的最大值推到答案的逻辑中存在一些缺陷。一些隐藏的测试用例失败了。
  • @GauravSetia 在 cmets 中描述您的代码远不如在您的问题中发布您的代码有用。
  • (@vish4071:嗯,它现在重新打开了。我的看法:如果你没有从错误的角度开始,那是微不足道的。)

标签: arrays algorithm data-structures


【解决方案1】:

从第二个例子来看,它不应该返回 1 吗?因为我们可以形成数组C = [4, 3, 3, 6, 5]也许我缺少一个条件?

更新

是的,对不起,我误解了这个过程。因此,您的方法似乎是正确的:将 A[i]B[i] 进行比较,然后选择较大的一个并将其分配给 C[i]

现在,要找到不在C 中的最小数字,在创建C 数组之后,您需要找到一种方法来查找所有现有的“间隙”(间隙,我的意思是两个数字 x 和 y 至少相差 2:例如 [2,4] 或 [110, 290]。您需要找到 x 的最小值。然后,答案就是 x + 1。

此外,您需要考虑根本没有间隙的情况,例如第三个示例。

例如,伪代码如下所示:


// If there is at least one gap

// find all the gaps
C.sort() // sort C to ascending order
// iterate C to find the first gap. And this gap will surely have the smallest x.

ans = min_x + 1;

// If there is no gap
if (min_element != 1) then ans = min_element - 1
else ans = max_element + 1

【讨论】:

  • 两个数组的第二个元素都是 2。我们必须逐个元素比较两个数组
  • @GauravSetia 是的,当然,我理解错了。我在回答中添加了我的想法。
【解决方案2】:

好吧,我将通过对您的方法提出反例来开始我的回答。比方说,输入是:

A = [3, 2, 1, 6, 5, 3] and B = [4, 2, 1, 3, 3, 3]

根据您的方法,C 将创建为:[4, 2, 1, 6, 5, 3],因此,答案将是 7

但可能的C 可能是:[3, 2, 1, 6, 5, 3],这导致答案是4。请注意,对于C[0],我们采用了A[0] and B[0] 的较小值。

我认为这个案子应该敲响一些警钟。这是我的方法:

  1. 既然我们有0 < A[i], B[i] <= 10^5,创建一个辅助数组,比如H,大小为10^5 + 1,并将其初始化为zeroes
  2. 现在,遍历A and B,寻找A[i] == B[i] 所在的值,并为这些值设置H[A[i]] = 1
  3. 再次遍历A and B。如果H[A[i]] == 1 or H[B[i]] == 1,继续。否则,设置H[max(A[i], B[i])] = 1
  4. 现在,从索引 1 开始迭代 H。您可以在其中找到第一个 0index 就是您的答案。

【讨论】:

  • (我认为你可以少做一次迭代(dang。我想我知道如何尝试少做一次迭代,但它似乎变得……复杂…… ) - 不会随着问题大小而改变增长或运行时间。)
  • 是的,2 次迭代并没有真正改变时间复杂度,但是如果我们尝试一次完成,那么它的实现就太复杂了。所以,我只是保持简单。
【解决方案3】:

我不确定这是否真的是您要问的问题,因为这很容易。

首先,找到你没有强制选择的最小正整数,即在A和B中都没有出现在相同位置的最小正整数。

然后,合并数组,选择除该整数之外的任何内容。

最大化最小的缺失整数将是一个更有趣的问题,所以我觉得你是想问这个问题。

【讨论】:

  • (在Interview 中,可能会有一些热身问题。根据(公司)文化,它们甚至可能被介绍为具有简单的解决方案。)
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2020-06-20
  • 2021-04-01
  • 1970-01-01
  • 2021-11-29
  • 2021-10-13
  • 2013-06-27
相关资源
最近更新 更多