题目要求在一个整数数组 nums
中,找到两数之和等于目标值 target
,并返回这两个数的索引。我们可以假设给定的输入只有一个解,并且不会重复使用同一个元素。
给定例子
-
示例 1:
- 输入:
nums = [2, 7, 11, 15]
,target = 9
- 输出:
[0, 1]
- 解释:因为
nums[0] + nums[1] == 9
,返回[0, 1]
。
- 输入:
-
示例 2:
- 输入:
nums = [3, 2, 4]
,target = 6
- 输出:
[1, 2]
- 解释:因为
nums[1] + nums[2] == 6
,返回[1, 2]
。
- 输入:
-
示例 3:
- 输入:
nums = [3, 3]
,target = 6
- 输出:
[0, 1]
- 解释:因为
nums[0] + nums[1] == 6
,返回[0, 1]
。
- 输入:
提示
- 数组的长度
nums.length
在 2 到 10,000 之间。 - 每个元素
nums[i]
的范围在 -10^9 到 10^9 之间。 target
的范围也是在 -10^9 到 10^9 之间。- 只会存在一个有效答案。
代码讲解
我们使用的是一个非常直观的方法,即双重循环遍历数组的每个可能的元素对来检查它们的和是否等于目标值 target
。
#include <vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
int n = nums.size();
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if ((nums[i] + nums[j]) == target) {
return vector<int>{i, j};
}
}
}
// 如果没有找到符合条件的元素对,虽然题目说一定存在,但这里返回一个空 vector 以防万一
return result;
}
};
代码详细解析
-
定义返回值和获取数组长度:
vector<int> result; int n = nums.size();
result
:用来存储结果的索引对。n
:数组nums
的长度。
-
双重循环遍历数组:
for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) {
- 外层循环
i
从 0 到n-2
:表示遍历每个主元素。 - 内层循环
j
从i + 1
到n-1
:表示从i
的下一个元素开始向后遍历,用来查找使和为目标值target
的另一个元素。
- 外层循环
-
检查元素和是否等于目标值:
if ((nums[i] + nums[j]) == target) { return vector<int>{i, j}; }
- 对每一对
nums[i]
和nums[j]
,检查它们的和是否等于target
。 - 如果条件成立,立即返回包含这两个索引的向量
vector<int>{i, j}
。
- 对每一对
-
返回空结果:
return result;
- 如果没有找到符合条件的元素对,返回一个空的结果向量。
- 由于题目假设一定存在一个答案,这一步通常不会被执行,但为了保险起见保持代码的完整性。
时间复杂度分析
- 外层循环执行
n-1
次。 - 内层循环的执行次数依赖于
i
的值,总体的执行次数大约为n * (n-1) / 2
次。 - 因此,总时间复杂度为 O(n2)。