Arrays 通过删除最小数量的元素,将给定的整数数组转换为已排序的整数数组
我正在处理以下问题: 我必须通过删除最小数量的元素,将给定的整数数组转换为排序的整数数组 例如:[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”各有一个冲突(与数字“2”)而数字“2”有两个冲突(与数字“3”和“5”)。 因此,在计算了冲突数组之后,我从原始数组中删除了冲突数最大的元素,并对其余数组重复此操作,直到所有元素都有0个冲突Arrays 通过删除最小数量的元素,将给定的整数数组转换为已排序的整数数组,arrays,algorithm,sorting,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”各有一个冲突(与
但是,这不是一种有效的方法(在某些情况下,我没有想到它也会产生错误的结果),因此我想知道是否有人能想出更好的解决方案。您可以基于数组中的元素构建DAG:
- 每个元素a[n]都是一个顶点
- 对于其中(m
/** * sortedArray : an array already sorted. * leftToSort : an unsorted array that need to be sorted/merged with sortedArray. * first call to this function must be sortArrayByRemoval([], arrayToSort); **/ public Integer[] sortArrayByRemoval(Integer[] sortedArray, Integer[] leftToSort){ if(leftToSort.size==0){ return sortedArray; //end of recursion } Integer candidate = leftToSort[0]; if(candidate>=sortedArray[last]){ //append candidate to the sorted array return sortArrayByRemoval(sortedArray.append(candidate) , leftToSort.removeFirst()); }else{ //either we skip it Integer[] result1 = sortArrayByRemoval(sortedArray,leftToSort.removeFirst()); //either we do back tracking Integer[] result2 = sortArrayByRemoval(sortedArray.removeLast(),leftToSort); //and finally we return the best choice (i.e. the longest array) return biggestArray(result1, result2); } }
也许不是最有效的,但我认为它给出了正确的答案。我相信这只是的巧妙伪装版本。如果删除最小数量的元素以获得排序序列,那么剩下的就是原始数组中最长的递增子序列罗恩:- 找到最长的递增子序列(该序列存在O(n logn)算法),然后
- 删除不在该子序列中的所有内容
希望这能有所帮助!如果你不想从原始数组中删除东西,那么你想要的是原始数字序列的最长递增子序列。这是一个众所周知的经典问题,你可以在文献或教科书中找到许多例子
(如果你一直在删除,那么……找到LCS并删除LCS以外的所有内容。)这听起来像是一个编程竞争问题。是吗?不,不是(甚至不知道你的意思)。这是我和我的团队在college.NP的一个项目的一小部分,我不想以任何方式冒犯他人,只是想了解更多动机方面的信息,因为这可能会影响可能的答案(例如,更多/更少的教育性或更多/更少的实用性)没关系,没有冒犯的意思。我想我在寻找一个实用的答案,因为它是关于一个编程项目的(我使用的工具并不重要,最让我困扰的是想法/算法)。这当然会起作用,但请注意,总时间是O(n^2),因为DAG中的最长路径在边数上是线性的,并且有O(n^2)其中的一个。这在O(n^2)时间内可以正常工作,但我认为可以在O(n log n)中解决此问题。@templatetypedef:我不确定它是O(n^2)考虑到我的优化。无论如何,你的解决方案更有效。这是一个很酷的优化!但是,我认为如果你让数组在比其他元素大和小的元素之间交替,这仍然会产生O(n^2)链接,尽管常数因子较低。@templatetypedef:谢谢,我同意。忍者被@templatetypedef打败了