给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
emmmm第一个想到的就是双层for循环遍历,顺便练习了一下容器迭代器的用法,明显这种写法性能不好。时间复杂度O(n^2)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>::iterator iter1; //迭代器
vector<int>::iterator iter2;
for(iter1 = nums.begin(); iter1 < nums.end(); ++iter1)
for(iter2=iter1+1;iter2 < nums.end(); ++iter2) //iter指向
{
if(*iter1 + *iter2 == target){ //*iter指向
vector<int> ans
({distance(nums.begin(),iter1),distance(nums.begin(),iter2)});
return ans;
}
}
}
};
网上找到一个别人的java写法,是用map写的。
先把各个元素对应的target的差值算出来。
比如nums = [2, 7, 11, 15], target = 9;
依此计算出map={ 7:0, 2:1 , -2:2 , -6:3 };
(key:value)key是结果,value是索引
然后再遍历数组,第一个:nums(0) = 2,去map中查是否有key为2的结果(对应原值为7)即可。
对应的索引分别是:nums遍历的i,map中对应的value值;时间复杂度O(n)
恩挖个map的坑在这,后面刷题会用到的。
public int[] twoSum(int[] nums, int target) {
if (nums == null || nums.length <= 1) {
return new int[2];
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// key = target - nums[i], just one solution
for (int i = 0; i < nums.length; i++) {
map.put(target - nums[i], i); //先把对应的计算结果存放在一个map中
}
for (int i = 0; i < nums.length; i++) {
Integer v = map.get(nums[i]); //看map当中是否有对应的计算结果
// can't use itself
if (v != null && v != i) {
return new int[] { i, v };
}
}
return null;
}