题意理解:给一个数组和一个整数,数组中有且仅有两个数的和是给出的整数,要求返回这两个数的角标。
思路:最初的思路不外乎是两重循环,全部遍历。那么有没有可以优化的呢?我想的是,其一 查找判断的时候,已经找过的不用再找了,其二,我们找到以后不用再找了。对于第一点我们二重循环从j = i+1 开始,而不是 j=0,避免重复查找,对于第二点,我们可以设置flag,退出循环,也可以找到后直接退出函数。
下面看代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ret;
for(int i=0; i<nums.size(); i++)
{
for(int j=i+1; j<nums.size(); j++)
{
if(target == nums[i] + nums[j])
{
ret.push_back(i);
ret.push_back(j);
return ret;
}
}
}
return ret;
}
};
这里函数的参数是vector的引用,避免复制,返回值是vector,我们直接在方法内定义局部变量即可,这里我们返回角标,所以用vector的索引而不是迭代器。
对于一些网上的java解法往往是定义hashmap
HashMap<Integer, Integer> map = new HashMap<>();
map的键可以存放数组中的具体值(target - num[i]),而map的值可以存放数组值对应的角标。
那么我们就可以单重循环。
map.containsKey(nums[i])
在循环中查找键
map.get(nums[i]);
这是根据key取得值的方法
map.put(target - nums[i], i);
这是添加一个键,值对,也可以
map[nums[i]] = i;
c++也有这种做法,只不过核心在于find方法
用insert插入键值对,用->second取出。