算法拼图访谈

flo*_*wer 46 algorithm

我找到了这个面试问题,我无法想出一个比O(N ^ 2*P)好的算法:

给定P自然数(1,2,3,...,P)的向量和另一个长度为N的向量,其元素来自第一个向量,找到第二个向量中最长的子序列,使得所有元素均匀分布(频率相同).

例如:(1,2,3)和(1,2,1,3,2,1,3,1,2,3,1).最长的子序列在区间[2,10]中,因为它包含来自具有相同频率的第一序列的所有元素(1出现三次,两次三次,三次三次).

时间复杂度应为O(N*P).

uty*_*uty 49

"子序列"通常表示不连续.我假设你的意思是"子列表".

这是一个O(NP)算法,假设我们可以哈希(假设不需要;我们可以改为基数排序).扫描阵列,保持每个号码的运行总计.以你为例,

  1  2  3
 --------
  0  0  0
1 
  1  0  0
2
  1  1  0
1
  2  1  0
3
  2  1  1
2
  2  2  1
1
  3  2  1
3
  3  2  2
1
  4  2  2
2
  4  3  2
3
  4  3  3
1
  5  3  3
Run Code Online (Sandbox Code Playgroud)

现在,通过减去最小元素来标准化每一行.结果是

 0: 000
 1: 100
 2: 110
 3: 210
 4: 100
 5: 110
 6: 210
 7: 100
 8: 200
 9: 210
10: 100
11: 200.
Run Code Online (Sandbox Code Playgroud)

准备两个哈希值,将每一行映射到它出现的第一个索引以及它出现的最后一个索引.通过键迭代并使用最后一个键 - 最后一个键.

000: first is at 0, last is at 0
100: first is at 1, last is at 10
110: first is at 2, last is at 5
210: first is at 3, last is at 9
200: first is at 8, last is at 11
Run Code Online (Sandbox Code Playgroud)

最好的密钥是100,因为它的子列表长度为9.子列表是第10个的第(1 + 1)个元素.

这是因为子列表是平衡的,当且仅当它的第一个和最后一个非标准化的直方图是相同的,直到添加一个常量,当且仅当第一个和最后一个标准化直方图相同时才会出现.

  • @Downvoter对不起破坏你最喜欢的面试问题.(或者你有合法的投诉吗?) (10认同)
  • @WeaselFox:你只需要遍历列表一次,每个条目检查代码(例如:200),如果它是新的代码集索引作为第一个,最后一个只作为最后一个.您还可以存储当前的最后一个最大值,因此在迭代结束时您可以获得解决方案.实际上你甚至不必存储最后一个索引. (2认同)

ami*_*n k 6

如果内存使用不重要,那很简单......

可以给矩阵尺寸N*p和保存在列(I)对应于多少个元素的值p之间寻找(ⅰ)在第二矢量的第一元素...

完成矩阵后,您可以搜索列中列i中的所有元素i没有不同的列.i答案是最大的.

  • 我想Karoly应该说的是 - 欢迎来到Stack Overflow,你的回答并不清楚. (9认同)
  • @amin k:我加入这里的原因之一就是提高我的英语水平......我知道第一次以清醒的方式写作是多么困难,只是尽力给你最好的;) (3认同)
  • 不用担心,你需要做的就是更多地解释你的想法.举一个例子,看看其他人在说什么,并尝试将你的解决方案与他们的解决方案联系起来 - 例如,听起来你的答案与上面的答案相似,所以你可能走在正确的轨道上.使用你所拥有的任何工具,不要气馁.需要一段时间才能感受到周围的事物 (2认同)