题目:两数之和
- 题号:1
- 难度:简单
- https://leetcode-cn.com/problems/two-sum/
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 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]
示例2:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
- 2<=nums.length<=1042 <= nums.length <= 10^42<=nums.length<=104
- −109<=nums[i]<=109-10^9 <= nums[i] <= 10^9−109<=nums[i]<=109
- −109<=target<=109-10^9 <= target <= 10^9−109<=target<=109
- 只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2)O(n^2)O(n2) 的算法吗?
实现
第一种:暴力匹配算法
C# 语言
public class Solution
{
public int[] TwoSum(int[] nums, int target)
{
int[] result = new int[2];
for (int i = 0; i < nums.Length - 1; i++)
{
int find = target - nums[i];
for (int j = i + 1; j < nums.Length; j++)
{
if (find == nums[j])
{
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
}
Python 语言
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums) - 1):
find = target - nums[i]
for j in range(i + 1, len(nums)):
if (nums[j] == find):
return [i, j]
第二种:利用字典的方式
把字典当作一个存储容器,key
存储已经出现的数字,value
存储数组的下标。
C# 语言
public class Solution
{
public int[] TwoSum(int[] nums, int target)
{
int[] result = new int[2];
Dictionary<int, int> dic = new Dictionary<int, int>();
for (int i = 0; i < nums.Length; i++)
{
int find = target - nums[i];
if (dic.ContainsKey(find))
{
result[0] = dic[find];
result[1] = i;
break;
}
if (dic.ContainsKey(nums[i]) == false)
dic.Add(nums[i], i);
}
return result;
}
}
Python 语言
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
dic = {}
for index, val in enumerate(nums):
find = target - val
if find in dic:
return [dic[find], index]
else:
dic[val] = index