刷100道a + b 也毫无意义。
看题目第一想法是两层遍历,明显O(n2)的时间复杂度不满足要求。
使用了java中HashMap
每次遍历数组,若这个元素在map中找不到,那么就插入,若存在,那么就找对应的target - element 的元素在不在,若存在,则返回
public static int[] twoSum(int[] nums, int target) {
// 创建一个hashmap,将所有元素插入到hashmap中,依次遍历nums, 找存在n1+ n2 = target在表中
HashMap <Integer,Integer> map = new HashMap<Integer,Integer>();
int []result = new int [2];
for ( int i = 0;i < nums.length;i++){
Integer element = map.get(nums[i]);
if(element == null){
map.put(nums[i], i);
}
element = map.get(target - nums[i]);
if (element != null && element < i){
result[0] = element + 1;
result[1] = i + 1;
return result;
}
}
return result;
}
3年后在做了这道题:(2019.2.28)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
int i = 0;
int j = 0;
vector<int> res;
for (vector<int>::const_iterator it = nums.cbegin(); it != nums.cend(); ++it)
{
hash.insert({ *it, i });
++i;
}
for (vector<int>::const_iterator it = nums.cbegin(); it != nums.cend(); ++it)
{
unordered_map<int, int>::iterator it_find = hash.find(target - *it);
{
if (it_find != hash.end() && it_find->second != j)
{
res.push_back(j);
res.push_back(it_find->second);
return res;
}
}
++j;
}
return res;
}
};
Runtime: 12 ms, faster than 97.81% of C++ online submissions for Two Sum.
Memory Usage: 10.8 MB, less than 6.21% of C++ online submissions for Two Sum.
还可以优化一下。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
int i = 0;
int j = 0;
vector<int> res;
for (vector<int>::const_iterator it = nums.cbegin(); it != nums.cend(); ++it)
{
hash.insert({ *it, i });
unordered_map<int, int>::iterator it_find = hash.find(target - *it);
if (it_find != hash.end() && it_find->second != i)
{
res.push_back(i < it_find->second ? i : it_find->second);
res.push_back(i > it_find->second ? i : it_find->second);
return res;
}
++i;
}
return res;
}
};
Runtime: 16 ms, faster than 57.75% of C++ online submissions for Two Sum.
Memory Usage: 10.4 MB, less than 26.36% of C++ online submissions for Two Sum.
不用迭代器访问,改用下标访问:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
vector<int> res;
for (int i = 0; i < nums.size(); ++i)
{
int num_find = target - nums[i];
if (hash.find(num_find) != hash.end())
{
res.push_back(hash[num_find]);
res.push_back(i);
return res;
}
hash[nums[i]] = i;
}
return res;
}
};
Runtime: 8 ms, faster than 100.00% of C++ online submissions for Two Sum.
Memory Usage: 10.4 MB, less than 34.11% of C++ online submissions for Two Sum.
这下子就快很多了。