题目:
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的 两个 整数。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
https://leetcode-cn.com/problems/two-sum/description/
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]、
方法一:O(n^2)
分析:
由题,每种输入只会对应一种答案,换句话说,就是,每一个target只会唯一的由数组中的两个数组成,因此不用考虑重复性。
最关键的是,需要嵌套的遍历两次数组,第一次遍历,提取数组中的一个元素,同时,与数组中的其余所有元素求和,判断是否凑成target。即,我们需要两个嵌套的for循环,在循环中做判断,同时,需要定义一个向量H,用来存放需要返回的两个数在数组中的位置。
for(int i=0;i<num.size();i++)
{
for(j=i+1;j<num.size();j++)
{
if(num[i]+num[j]==target)
{
H.puch_back(i);
H.push_back(j);
return H;
}
}
}
代码:(C++)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> H;
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
H.push_back(i);
H.push_back(j);
return H;
}
}
}
}
};
代码:(python)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0,len(nums)-1):
for j in range(i+1,len(nums)):
if nums[j]==target-nums[i]:
return [i, j]
注意:i,j的取值范围
方法三:(C++)
分析:
用字典来查找解决,unordred_map基于hash,O(n)时间完成,空间O(n)
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> record;
for(int i = 0; i <nums.size(); i++){
int complement = target - nums[i];
if(record.find(complement) != record.end()){
int res[2]= {i, record[complement]};
return vector<int>(res,res+2);
}
record[nums[i]] = i;
}
throw invalid_argument("the input has no solution");
}
};