You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解数组差值≤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:13:15