【发布时间】:2013-08-02 14:05:15
【问题描述】:
给定 n 对数字,第一个数字总是小于第二个数字。当且仅当 b
例如{ (1,2), (3,4), (5,7), (9,10), (7,9), (8,9), (0,6) }
所以输出应该是:{(1,2), (3,4), (5,7), (8,9), (9,10)}
我的算法如下:
1. Sort the list according to the 2nd number of elements
i.e.`{ (1,2), (3,4), (0,6), (5,7), (7,9), (8,9), (9,10) }`
2. choose the first element from the list i.e. `(1,2)`
3. for each element e in the list left
4. choose this element e if the first number of the element is greater than the 2nd number of the previous element. i.e. after `(1,2)` choose `(3,4)` because `3 > 2.`
经过上述算法,您将得到{(1,2), (3,4), (5,7), (8,9), (9,10)}的输出。
请让我知道算法的正确性。谢谢。
编辑:
更直观的正确性证明:
证明:在链中包含更多对的唯一方法是用 Y 值较小的一对替换一对,以允许下一个 对具有较小的 X 值,可能适合另一对 以前装不下。如果您将一对替换为具有相同 Y 的一对 价值,你一无所获。如果替换的 Y 值较大,则所有 你所做的可能会阻止一些以前适合的对。
因为这些对是按 Y 值排序的,所以您永远找不到 Y 值较小的替代品。在排序中“向前” 对,它们都将具有相同或更大的 Y 值。看着 “向后”,最初从链中消除的任何东西都是 因为X值不够高,还是会这样。
这取自here
【问题讨论】:
-
你为什么把 (7,9) 排除在外?为什么它不在对 (5,7) 之后?
-
给定您的示例的另一个有效链是 {(1,2), (3,4), (5,7), (7,9), (9,10)}。您是否希望找到两个/所有链,无论是链、最大长度链还是其他?
-
我认为这行不通,因为它很贪心。排除包含的一个元素可能会产生更长的链条。我认为这需要作为一个动态程序来完成。
-
这个问题要求进行代码审查,但没有提出问题。这个问题更适合 CodeReview。
-
不管怎样,你的算法是正确的。稍后我可能会发布一个证明。