2 回答
TA贡献1829条经验 获得超7个赞
我建议答案是a.length / 2。数组长度的一半(如果长度为奇数,则向下舍入)。您可以以任何您喜欢的方式配对数字。对于非负a和b如果a * 2 < b,只需交换a和b,您将得到a * 2 >= b。因此,由于配对需要两个数字,因此您始终可以精确地形成与数组长度的一半一样多的配对。
示例(来自评论):[1, 2, 2, 2]。长度是4,长度的一半是2,所以应该有2对。让我们检查一下:(1, 2) 是一个不错的对,因为 1 * 2 >= 2。(2, 2) 是另一个不错的对,因为 2 * 2 >= 2。在这种情况下,我们甚至不需要任何交换 (on另一方面,相同的对也可以用于交换:2 * 2 >= 1 和 2 * 2 >= 2)。
如果数组可能包含负数,它并不总是有效。因此,您可能想要添加一个数组验证来检查它是否没有。
您的解决方案出了什么问题?
您的递归算法是错误的。假设数组是 [2, 3, 7, 9]。显然 (2, 3) 和 (7, 9) 是很好的对,所以这里有两对。你描述你的算法的方式,因为 (2, 9) 不是一个有效的对,你丢弃 2 和 9 中的至少一个,没有机会从剩余的数字中形成两对。
TA贡献1876条经验 获得超6个赞
你可以这样解决它:
一世。排序数组。
ii. 对于每个数字a找到包含 >= 2*b 的数组的最左边位置p 。然后你可以数出有多少满意。
复杂度:O(nlogn)+nlogn
添加回答
举报
