求解数组差值≤K的最大子集遇错,疑惑abs与区间条件差异
问题排查与解答
1. 代码存在语法错误
你的代码中条件判断语句多了一个右括号,这会直接导致编译失败,无法输出正确结果:
// 错误写法:末尾多了一个 ) if(Math.abs(diamonds[i] - diamonds[j]) <= K))
修正后应为:
if(Math.abs(diamonds[i] - diamonds[j]) <= K)
2. 两个条件的逻辑差异
官方解法的条件diamonds[i] <= diamonds[j] && diamonds[j] <= diamonds[i] + K,是基于数组已提前排序的前提设计的:
- 排序后数组元素递增,
diamonds[i] <= diamonds[j]确保只统计当前元素右侧(含自身)的元素,避免重复计算(比如i=0,j=1和i=1,j=0的重复统计,虽不影响最终max值,但会降低效率); - 因为数组递增,
diamonds[j] >= diamonds[i],所以diamonds[j] <= diamonds[i]+K等价于Math.abs(diamonds[i]-diamonds[j]) <= K,无需用绝对值计算,减少了运算量。
你的条件Math.abs(diamonds[i] - diamonds[j]) <= K,无论数组是否排序,逻辑本身是正确的——只要两个元素差值绝对值不超过K就计数,最终取以每个元素为中心的符合条件元素总数的最大值。但未排序时时间复杂度为O(n²),效率远低于排序后用双指针的O(n log n)解法。
3. 题目理解验证
USACO的Diamond Collector题目要求是:选出尽可能多的钻石,使得其中最大与最小钻石的尺寸差不超过K。这和你理解的“任意两个整数差值≤K”完全等价——子集内最大最小差≤K时,任意两个元素的差值必然≤K,反之亦然。你的逻辑方向是对的,问题核心在于代码语法错误,以及未注意到官方解法依赖排序的前提。
内容的提问来源于stack exchange,提问作者Dolfinwu
相关产品推荐
相关产品推荐

