请教LeetCode中twoSum函数里return {}语句的作用逻辑
关于LeetCode两数之和问题中
return {};的疑问解答 你好呀~其实这个问题的核心点在于那行return {};根本不会被执行到,下面给你拆解清楚:
首先先看题目背景:LeetCode的「两数之和」题目明确规定了「输入数组中一定存在唯一的有效解」,这是关键前提。
然后看这段代码的逻辑:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hashtable; for (int i = 0; i < nums.size(); ++i) { auto it = hashtable.find(target - nums[i]); if (it != hashtable.end()) { // 找到符合条件的元素对,直接返回结果,循环终止 return {it->second, i}; } // 没找到的话,把当前元素和索引存入哈希表 hashtable[nums[i]] = i; } // 下面这行代码永远不会被执行 return {}; } };
为什么return {};不会被执行?
因为题目保证了存在唯一解,所以在遍历数组的过程中,必然会有某一个时刻,target - nums[i]恰好存在于之前存入哈希表的元素中(也就是我们要找的另一个数),这时候会立刻执行return {it->second, i};跳出函数,循环根本走不到最后一步。
那为什么还要写这行代码?
这是C++的语法要求:函数声明了返回vector<int>类型,编译器要求函数的所有分支都必须有明确的返回值。虽然我们从逻辑上知道这个分支永远不会走到,但编译器没法理解题目中的业务逻辑,所以必须补上这行代码来满足语法规则,否则编译会报错。
简单总结:return {};确实是返回空的vector,但它只是个语法兜底,实际运行中永远不会被触发,所以代码能正常返回有效结果~
内容的提问来源于stack exchange,提问作者air




