题目描述
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
题解
① C++: 我所使用的方法:暴力法
思路:直接遍历容器,复杂度为O(n²)
直接上代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v; // 初始化一个vector
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if(nums[i] + nums[j] == target){
v.push_back(i);
v.push_back(j);
break;
}
if(v.size() == 2)
break;
}
}
return v;
}
};
效果:
执行用时: 84 ms, 在Two Sum的C++提交中击败了54.86% 的用户
② Java: Map方法
思路:HashMap设计的原理就是使得原来是数组的存取更加高效
话不多说,上代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// 把数组中的元素放到map里,以便存取
// 样式是Key元素值,Value下标
for(int i = 0; i < nums.length; i++){
map.put(nums[i], i);
}
// 开始查找
for(int i = 0; i < nums.length; i++){
/*
① 获取补数
② 检查map中是否包含补数,如果(包含 + 不是原来的下标),返回
*/
int complement = target - nums[i];
if(map.containsKey(complement) && map.get(complement) != i)
return new int[] {i, map.get(complement)};
}
throw new IllegalArgumentException("No two sum solution");
}
}
效果:
③ 优化的方法 ②
思路:边向Map中插入边检查是否满足
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int complement = 0;
for(int i = 0; i < nums.length; i++){
complement = target - nums[i];
if(map.containsKey(complement))
return new int[]{map.get(complement), i};
map.put(nums[i], i);
}
throw new IllegalArgumentException("No solution!");
}
}
效果: