我有一个考试问题,要求解决方案找到算术系列n,n * 2,n * 3,n * i(其中i是数组长度-1)中有多少个连续数字在随机数组中。只要从n开始并且数字是连续的,系列中的数字可以是数组中的任何顺序。允许重复。
例如:n = 2,你的数组是[4,5,1,2,1,2,6,10]
将返回3.因为从2开始的最长连续运行是2,4,6。
我提出的解决方案是将上面的数组转换为[2,0,0,1,0,1,3,5],将n(2)整除的数除以n并改变非模n的数到了0.
然后我将数组快速分配到[0,0,0,1,1,2,3,5]并进行线性检查以找到答案。
这给了我一个2n + n log n或O(n log n)的解决方案。
这个问题有更好的解决方案吗?我的意思是一个更好的数量级,如O(n)。
答案 0 :(得分:2)
使用额外存储空间的O(i)解决方案是使用大小为i的位向量初始化为0.如果遇到n * j,则遍历数组并将条目j设置为1。之后,找到位向量开头的1的数量。
答案 1 :(得分:0)
如果值的范围存在合理且已知的界限,则可以使用counting sort将复杂度降低为O(n)(或者在您的术语中为O(i))。
答案 2 :(得分:0)
你开始很好。循环遍历数组并将每个数组单元 Aj 设置为 Aj / n 。
制作一个长度为 i-1 的数组(您有 i-1 数字)。
将它们全部设为零。
再次遍历数组,对于您遇到的每个数字( k ),将位 k (如果小于 m )设置为1
从位置1循环通过位数组,并在第一个零点处停止。这就是结果。
你有 4 * i 迭代...... O(i)