arrays - 通过删除最小数量的元素,将给定的整数数组转换为排序数组

标签 arrays algorithm sorting

我正在解决以下问题:

我必须通过删除最小数量的元素,将给定的整数数组转换为排序数组。

例如:[3,5,2,10,11] 将通过删除‘2’来排序:[3,5,10,11]。 或者 [3,6,2,4,5,7,7] 将通过删除 '3','6' 进行排序: [2,4,5,7,7] 或删除 '6','2' : [3,4,5,7,7](我删除 2 个元素的两种方式,这就是为什么它们都是正确的)。

我的想法是为每个元素保留一个计数器,看看它与其他元素有多少冲突。 我所说的冲突是什么意思:在第一个示例中,数字“3”和“5”各有 1 个冲突(数字“2”),数字“2”有 2 个冲突(数字“3”和“5”) . 因此,在计算出冲突数组之后,我从原始数组中删除了具有最大冲突数的元素,并对剩余数组重复,直到所有元素的冲突数为 0。

虽然这不是一种有效的方法(在某些情况下我还没有想到它也可能产生错误的结果),所以我想知道是否有人能想到更好的解决方案。

最佳答案

我相信这只是 longest increasing subsequence problem 的巧妙伪装版本. 如果您删除了具有排序序列的最小数量的元素,则剩下的是原始数组的最长递增子序列。因此,您可以执行以下操作:

  1. 找到最长的递增子序列(为此存在 O(n log n) 算法),然后
  2. 删除不在该子序列中的所有内容。

希望这对您有所帮助!

关于arrays - 通过删除最小数量的元素,将给定的整数数组转换为排序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13863373/

相关文章:

jquery - 按 div 标签内的数字和 jQuery 对 div 进行排序

将动态 c 数组循环移位 n 个元素

arrays - GO:数组/slice 到常规字符串

java - 如何将二维数组相乘?矩阵乘法

algorithm - golang []interface{} 不能作为函数参数吗?

arrays - 如何按最频繁点的顺序排列 CGPoint 数组

c - 高效的循环队列重新排序

c++ - 在 C++ 中对矩阵缓存友好的 C++ 操作?

performance - 查找集合成员的有效方法

python 对元组列表进行排序