排列一个整数数组,使得没有两个连续数字的总和可以被 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
现在我们可以使用贪心策略:注意来自桶 1
和 2
的元素不能是邻居,来自桶 0
和 0
的元素也是如此
我们可以将桶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. 求众数(