Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
题目大意:
给一些整数,找到2个数,它们的和等于目标数,返回它们的下标(从0开始)。题目保证只有一个解,并且每个数最多只能用一次。
方法一:
很容易想到的,遍历,时间复杂度0(n*n),空间复杂度0(1)。
实现是看网上的,第一次用leetcode,不知道该怎么返回什么。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v(2);
for(int i = 0; i < nums.size(); i++) {
for(int j = i + 1; j < nums.size(); j++) {
if(nums[i] + nums[j] == target) {
v[0] = i;
v[1] = j;
return v;
}
}
}
}
};
方法二:映射
这是参照别人的,把数映射到其下标,遍历的时候只要找对应的数的下标是否存在即可。遍历2次,时间复杂度0(n),空间复杂度0(n)。
注意:目标数如果为某个数的2倍,则应该判断。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>mp;
int i,j;
for(i=0;i<nums.size();i++){
mp[nums[i]]=i;
}
for(i=0;i<nums.size();i++){
int a=target-nums[i];
if(mp.find(a)!=mp.end() &&(mp[a]!=i)){ //目标数如果为某个数的2倍
return {i,mp[a]};
}
}
}
};
方法三:
参照别人的,只需遍历一次即可。时间复杂度0(n),空间复杂度0(n)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int>mp;
int i,j;
for(i=0;i<nums.size();i++){
int a=target-nums[i];
if(mp.find(a)!=mp.end()){
return {i,mp[a]};
}
mp[nums[i]]=i;
}
}
};