ami*_*odi 14 java arrays algorithm array-algorithms
制约因素:
这不是一个家庭作业问题,只是我遇到的一个有趣的问题.
以下是我能想到的一些解决方案,但在给定的约束条件下没有任何解决方案.
方法1
*带O(n)内存*
方法2
在O(n log n)时间内
方法3
如果定义了数字范围
如果情况是数字在特定范围内,那么我可以初始化一个int说track = 0; 当我遇到数组中的数字时设置适当的位,例如(1 << a [2]).1.将字母交换到数组2的前半部分.在轨道变量3中标记数字.稍后使用轨道填充数组的后半部分.
方法4 如果我们想要删除整数范围的约束但是它需要更多的内存,我们可以将方法3与HashMap一起使用.
想不出更好的方法来解决O(1)时间和O(n)空间中的泛型问题.
这里的一般问题是指:
给定序列x1y1x2y2x3y3 .... xnyn其中x1,x2是字母x1 <x2 <.... <xn和y1y2 ... yn是整数.y1 <y2 <.... <yn将输出排列为x1x2 ... xny1y2 ... yn
有什么建议 ?
什么是n
?假设这n
是输入的大小:
这称为列表的卷积.实质上,您必须将对列表转换(a,1),(b,2),(c,3),(d,4)
为一对列表(a,b,c,d),(1,2,3,4)
.它与矩阵的转置操作相同.
无论如何,您必须将结构视为k维数组,其中k = lg n.当你在索引i"移动"索引i按位旋转时,你得到的数组的卷积.在这种情况下,我们希望将索引向右旋转1位.这意味着卷积是一个最大周期长度为k的置换.然后诀窍是从每个循环中选择一个索引 - 这将始终包括0和n-1.
编辑:实际上,你可能想要的是将置换分解为换位的产物.然后,您需要做的就是交换.