其实题目讲的不是很清楚, 比如数据规模, 以及整数范围. 以及"数组中同一个元素不能使用两遍", 我误以为不可重复. 以下解法是当成不可重复的来实现的, 好在我们关注的练习, 而不是非得解题。 A. 假如数据规模不是很大, 并且是正整数的话, 那么可以用数组来存储位置, 比如示例中, num = [2,7,11,15] 就可以转化成num[2]=1, num[7]=2,num[11]=3,num[15]=4 我们假定偏移从1开始, 如果是0, 则表示不存在对应值. 步骤如下: 从数组num中找出最大值 根据最大值分配数组T 循环数组num,设置T对应位置的偏移(注: 从1开始, 因为0被用来表示不存在) 再循环数组num, 得到 [target - 当前元素] 对应的偏移位置, 便是了... 大致是3次遍历num, 即, O(3n) // // PHP代码如下 // 我感觉PHP做为一种宏语言来描述算法也不错 // function twoSum($nums, $target) { $maps = array_flip($nums); $rests = array_map(function($item) use($target) { return $target - $item; }, $nums); // leetcode 里php版本不是最新的 不然 fn($item) => $target - $item // 自然是最好的 $ret = []; foreach($rests as $k => $v) { if (isset($maps[$v]) && ($v<<1 !== $target)) { $ret[$k] = true; } } return array_keys($ret); }