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

Google Kick Start:Dart代码超时排查——算法无错?代码还是语言问题?

Dart代码在Google Kick Start超时:是实现细节还是语言本身的问题?

嘿,我来帮你拆解这个问题!你的算法逻辑完全没问题——核心思路是通过相邻元素差值的连续性来统计最长算术子数组长度,这个方向抓得很准。不过超时大概率是代码实现的细节优化不到位,而非Dart语言本身的锅,毕竟Dart处理这类线性遍历问题的性能完全够用。

先分析现有代码的性能瓶颈

你的代码里有几个可以优化的点,这些点在大数据量测试用例下会放大时间开销:

  1. 额外的diff数组:你先遍历原数组生成差值数组,再遍历差值数组统计连续相同值的长度,这相当于多了一次O(n)的遍历,还额外占用了O(n)的内存。对于1e5级别的输入,这部分开销会很明显。
  2. 输入处理的低效操作:用forEach逐个add元素到数组,每次调用闭包都有额外开销;加上没有显式类型声明,Dart的类型推断会增加一点点编译/运行时的成本。
  3. 不必要的变量操作:比如每次循环都调用max(answ, size),其实可以只在currentLength增长的时候再比较更新最大值,减少函数调用次数。

优化后的代码实现

我把你的代码做了针对性优化,既保留核心逻辑,又大幅提升性能:

import 'dart:io';

int longestArithmeticSubarray(List<int> array) {
  // 处理边界情况:数组长度小于2时直接返回原长度
  if (array.length < 2) return array.length;
  
  int maxLength = 2;
  int currentLength = 2;
  int prevDiff = array[1] - array[0];
  
  // 直接遍历原数组,实时计算差值并比较,省掉diff数组
  for (int i = 2; i < array.length; i++) {
    final currentDiff = array[i] - array[i - 1];
    if (currentDiff == prevDiff) {
      currentLength++;
      // 只有当currentLength超过max时才更新,减少不必要的赋值
      if (currentLength > maxLength) {
        maxLength = currentLength;
      }
    } else {
      prevDiff = currentDiff;
      currentLength = 2;
    }
  }
  return maxLength;
}

void main() {
  final testCases = int.parse(stdin.readLineSync()!);
  for (int caseNum = 1; caseNum <= testCases; caseNum++) {
    final n = int.parse(stdin.readLineSync()!);
    // 用map+toList批量转换,比forEach逐个add更高效
    final array = stdin.readLineSync()!
        .trim()
        .split(' ')
        .map(int.parse)
        .toList();
    print("Case #$caseNum: ${longestArithmeticSubarray(array)}");
  }
}

优化点说明

  1. 去掉diff数组:直接在原数组上遍历,实时计算当前差值和前一个差值比较,一次性完成统计,减少了一次遍历和内存分配。
  2. 输入处理优化:用map+toList批量转换字符串到整数列表,比forEach逐个添加的方式减少了闭包调用开销,效率更高。
  3. 显式类型声明:给函数参数、返回值、变量都加上显式类型,让Dart编译器可以做更多静态优化,提升运行速度。
  4. 边界情况处理:增加了数组长度小于2的特殊处理,避免逻辑错误(比如原数组长度为1时,你的代码会返回2,这不符合题意)。

最后一个关键提示

如果优化后还是超时,一定要确保用AOT编译运行代码:

dart compile exe your_script.dart
./your_script.exe

竞赛环境下,Dart的JIT模式(dart run)速度远不如AOT编译的原生可执行文件,编译后性能会大幅提升。

总结

你的算法逻辑完全正确,超时问题是实现细节可以解决的,调整后应该能轻松通过时间限制。

内容的提问来源于stack exchange,提问作者Иван Поздняков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:37:54