题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

题目分析

关于示例程序

其中包含动态数组
在调用函数时数据已经储存在变量中

vector twoSum() 是一个函数的声明
vector 表示这个函数的返回值是一个 整数类型的动态数组(即 std::vector)。
std::vector 是 C++ 标准库中的一个容器,用于存储动态大小的数组。

1
2
3
4
5
6
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {

}
};

解答

暴力法

没两个数的组合都试一遍,一路遍历过去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n;
n = nums.size();
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(nums[i] + nums[j] == target)return {i,j};
}
}
return {};
}
};

中途出现过的错误:

  1. size函数使用错误:写成nums.size;
  2. for循环里的返回类型没想到:既然是返回数组,就要用大括号
  3. 忘记给函数twoSum()添加返回值:返回值为数组,则用“{}”,而不是0或其他什么

哈希表法

哈希表特点:快速查找、插入和删除,并且不关心键的顺序

直接拿target-当前所指的数,如果差在数组中可以找到,则返回这两个数的索引
而遍历的话,则要O(N),时间复杂度高。如果用哈希表,把每个元素作为key,索引作为value,直接查表的话,就是O(1)

哈希表用法:

1
2
3
4
5
unordered_map<int, int> hashtable;//创建哈希表  
map.add(nums[i], i);//向哈希表中加入key-value

map.confainskey(diff);//查找到key,值为diff的key存在
a = map.get(diff);//提取diff对应的索引value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
for(int i = 0; i < nums.size(); i++)
{
int diff = target - nums[i];
auto j = map.find(target - nums[i]);
if (j != map.end())return {j->second, i};

// 在查找之后再插入当前元素,避免重复使用同一个元素
map[nums[i]] = i;
}
return {};
}
};

一些补充和辨析

  1. nums.size()与len(nums)的区别
    nums.size()主要用于 C++ 语言,nums 通常是 std::vector 类型的对象,std::vector 是 C++ 标准库中用于表示动态数组的容器。
    len(nums)主要用于 Python 语言,nums 可以是 Python 中的列表(list)、元组(tuple)、字符串(str)等可迭代对象,这些对象在 Python 中都可以使用 len() 函数来获取其长度。
  2. 在for里定义了变量i,新的for是否要再定义一遍:c++与java需要,python不需要

题目来源

https://leetcode.cn/problems/two-sum/description/