【LeetCode】1. 两数之和
标签:数组,哈希表
链接:
https://leetcode-cn.com/problems/two-sum
描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
vector<int> twoSum(vector<int>& nums, int target) {}
思路:
先考虑一道简单题:如何在一个整数数组 \(nums\) 中查找一个目标值 \(temp\) 。
使用最直接的思路,遍历数组中的元素。
for(int j = 0; j < size; j++){
if(nums[j] == temp){
return j;
}
}
然后,回到本题:如何在一个数组中找出和为目标值的那两个整数。
遍历数组的每一个元素 \(nums[i]\) 时,
在前段数组中查找是否存在值为 \(target - nums[i]\)。【上面的简单题】
复杂度分析:
时间复杂度:\(O(n^2)\)
空间复杂度:\(O(1)\)
C++
展开后查看
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
int temp = target - nums[i];
for(int j = 0; j < i; j++){
if(nums[j] == temp){
return {j, i};
}
}
}
return {-1, -1};
}
};
Java
展开后查看
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];
for(int j = 0; j < i; j++){
if(nums[j] == temp){
return new int[]{j, i};
}
}
}
return new int[]{-1, -1};
}
}
优化:使用哈希表
对于上面算法,检查前段数组中是否存在目标元素这一步,比较费时。
可以使用哈希表存储前段数组,加快查找速度,用空间换时间。
遍历数组的每一个元素 \(nums[i]\) 时,
在哈希表中查找是否存在值为 \(target - nums[i]\),
存在,就可以直接返回了
否则,将当前元素 \((nums[i], i)\) 作为 \((key, value)\) 存入哈希表中
C++
展开后查看
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 temp = target - nums[i];
if(map.count(temp) == 1){
return {map[temp], i};
}
map[nums[i]] = i;
}
return {-1, -1};
}
};
Java
展开后查看
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];
if(map.containsKey(temp)){
return new int[]{map.get(temp), i};
}
map.put(nums[i], i);
}
return new int[]{-1, -1};
}
}