【问题标题】:List value reduction algorithm列表值缩减算法
【发布时间】:2013-10-16 02:33:26
【问题描述】:

请原谅我,但我很困惑,我找不到任何指向正确方向的来源。

给定 n 个元素的列表:

[3, 6, 5, 1]

将值减小到不大于列表的大小,同时保持优先级值彼此之间的相对关系(按其原始顺序)。

约束:

  • 必须维持秩序
  • 元素 >= 0
  • 不同的值

我试图避免排序和创建新列表,而是就地修改列表。

我的预期结果应该是:

[1, 3, 2, 0]

是否存在解决此问题的算法?

【问题讨论】:

  • 更新:我已经找到了专门针对这个问题的解决方案,但它不适用于所有问题,尤其是范围很大的列表。 pastebin.com/jBJXcZtm
  • 我认为这不是一个真正的解决方案。我只是碰巧为这组特定的价值观工作。
  • 这是我一直在努力改进的解决方案:pastebin.com/21vb9RH5 感谢@Geobits 的输入。

标签: algorithm list mutation


【解决方案1】:

你可以在 O(n^2) 中做到这一点。

只需遍历列表n 次,将最小元素(而>= i)每次设置为i,其中i 从0 开始并递增到n-1

我怀疑您正在寻找比这更好的东西,但我不确定您在原地可以做得更好。

例子:

Input: 3  6  5  1

3  6  5  0*
1* 6  5  0
1  6  2* 0
1  3* 2  0

注意:这假定元素是 >= 0 和不同的

【讨论】:

  • 抱歉信息不足,您的假设:“元素 >= 0 且不同”是正确的。我会更新我的问题。
  • 很好,这样就可以了。您在 cmets 中添加的解决方案在大多数情况下都不起作用,因为您正在寻找最大值同时降低每个最大值。它会在某个时候遇到相同的元素。这样,您只会在寻找最小值的同时将它们向下移动,因此它们不会干扰。
  • 谢谢,我会试试这个。我希望有一个 O(2n) 解决方案:-)
【解决方案2】:

可能有一个,但如果您考虑解决此问题所需采取的步骤,则不需要它。

首先,您知道数组中的每个值都不能大于 4,因为这就是这个特定示例中的大小。

您需要遍历数组中的每个数字,并使用 if 条件检查该数字是否更大;如果是,那么您需要递减它,直到它满足正确的条件(在这种情况下,它小于 4)。

对数组的每个索引执行这些步骤。至于顺序,不要交换任何索引,因为您必须保留原始顺序。希望对您有所帮助!

【讨论】:

  • 那么,在问题中给出的原始输入中,您究竟是如何减少第二个和第三个数字(最初是 6 和 5),同时保持顺序?交换索引(或缺少索引)根本不能解决这个问题。
  • 假设您可以使用一个变量来保存数组的大小并检查特定索引处的 int 值。如果它大于大小,则将其递减,直到达到所需值。我根本不建议交换索引。如果我没记错的话,他需要保留原来的订单。
  • 问题是,如果我按照你原来的说法来信; 6 和 5 都将减少到 3。你需要其他东西来确定如何区分两者。
  • 好点,我没听懂。也许他可以同时将它与之前的指数进行比较。这样他就可以保持原来的关系。感谢您指出这一点,但没有看到。
  • 更好,但请记住,一旦减量,您就会丢失减量前的信息。换句话说,一旦你递减 5,如果你已经将 6 递减为 3,那么在没有其他数据结构的情况下,你无法确认 3 曾经是 6。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多