【问题标题】:Arrange an integer array such that no two consecutive numbers sum is divisible by 3排列一个整数数组,使得没有两个连续数字的总和可以被 3 整除
【发布时间】:2019-11-11 08:12:15
【问题描述】:

我的一个朋友在对一家公司进行在线评估时遇到了这个问题,并问了我这个问题。

给定一个整数数组,我们必须(可能)排列数组,使得没有两个连续数字的总和可以被 3 整除。

数组大小n<=10^5

如果没有这样的安排,那么我们必须返回Not Possible

我可以考虑贪婪地填充整数,这样连续元素的总和如果不能被 3 整除,就会给出O(n^2) 解决方案(但是我不确定贪婪地填充元素是否会在这里给出解决方案) 或者我可以考虑通过查看所有可能的安排来做一个(蛮力)DFS,但这将是一个指数时间解决方案,并且对于给定的数组大小条件肯定不会在这里工作。

是否有任何O(nlogn)O(n) 解决方案可以解决这个问题?

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:

    是的,存在 O(n) 解:

    1. 首先将所有元素分成3个桶,元素x将属于桶x mod 3
    2. 现在我们可以使用贪心策略:注意来自桶 12 的元素不能是邻居,来自桶 00 的元素也是如此
    3. 我们可以将桶1中的所有元素放入答案中,然后将桶中的一个元素0和桶中的所有元素2
    4. 现在剩下的就是桶 0 中的一些元素,我们可以将它们放在桶 1 的两个元素或桶 2 的两个元素之间
    5. 当然,有些极端情况是不可能解决的

    【讨论】:

    • 有一个缺失的情况:您也可以在前面或后面添加一个 0(假设存储桶 1 和 2 不为空)。 [0,1,0,2,0] 是一个测试用例。
    • 使用恒定的额外空间进行编码看起来很有用。
    【解决方案2】:

    算法:将数字分成三组:组 0 = 0 模 3,组 1 = 1 模 3,组 2 = 2 模 3。设 n0、n1、n2 为组 0、1​​ 或2.

    第 1 组和第 2 组的元素必须由第 0 组的元素分隔:如果 n0 = 0,并且 n1 > 0 和 n2 > 0,则无解。如果 n0 = 0,并且 n1 = 0 或 n2 = 0 或两者兼有,则无需执行任何操作。

    令n = n0 - 1。我们需要第1组和第2组的n个元素来分隔第0组的项目:如果n > n1 + n2,则无解。

    现在 0 ≤ n ≤ n1 + n2。令 m = min (n1, n)。从第 1 组的 n1 - m 个元素开始,然后是 m 对(第 0 组的元素,第 1 组的元素),然后是 (n - m) 对(第 0 组的元素,第 2 组的元素),然后是最后一个第 0 组的元素,然后是第 2 组的剩余 n2 - (n - m) 个元素。

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多