排列一个整数数组,使得没有两个连续数字的总和可以被 3 整除

Posted

技术标签:

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

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

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

数组大小n<=10^5

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

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

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

【问题讨论】:

【参考方案1】:

是的,存在 O(n) 解:

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

【讨论】:

有一个缺失的情况:您也可以在前面或后面添加一个 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) 个元素。

【讨论】:

以上是关于排列一个整数数组,使得没有两个连续数字的总和可以被 3 整除的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode1269. 停在原地的方案数 / 剑指 Offer 38. 字符串的排列 / 216. 组合总和 III / 剑指 Offer 39. 数组中出现次数超过一半的数字/229. 求众数(

将数组拆分为大约等于总和而不重新排列

LeetCode面试题 16.17. 连续数列

526. 优美的排列

leetcode-526 优美的排列

蓝桥杯真题05