算法思路
方法1 暴力求解
(最朴素简单,但不推荐使用)
两层循环,穷举所有可能
复杂度
时间:O(n^2)
空间:O(1)
方法2 用空间换时间,使用map,两次遍历即可
map
流程:
1)第一次遍历:将每个元素和它的下标存入numsMap中
2)第二次遍历:对于nums[i],判断numsMap中是否有target-nums[i]这个元素的下标不为i,如果有,就找到了答案,即i和numsMap[target-nums[i]]
复杂度:
时间:O(n)
空间:O(n), 因为map需要存储空间
方法3 针对方法2进行改进,只需要一次遍历就行
(一边找一边存,方法2是先统一存再统一找)
流程:
遍历nums对于nums[i], 看numsMap里是否有target-nums[i]这个元素,如果有 就找到了答案
复杂度:
时间:O(n)
空间:O(n), 因为map需要存储空间
代码
C++代码
这里给出方法2的代码
vector<int> twoSum(vector<int>& nums, int target) {/* 算法思路方法1 暴力求解(最朴素简单,但不推荐使用):两层循环,穷举所有可能复杂度时间:O(n^2)空间:O(1)****************方法2 用空间换时间,使用map,两次遍历即可map<int, int> numsMap; // 存放数字-下标流程:1)第一次遍历:将每个元素和它的下标存入numsMap中2)第二次遍历:对于nums[i],判断numsMap中是否有target-nums[i]这个元素的下标不为i,如果有,就找到了答 案,即i和numsMap[target-nums[i]]复杂度:时间:O(n)空间:O(n), 因为map需要存储空间****************方法3 针对方法2进行改进,只需要一次遍历就行(一边找一边存,方法2是先统一存再统一找)流程:遍历nums对于nums[i], 看numsMap里是否有target-nums[i]这个元素,如果有 就找到了答案*/// 使用方法2map<int, int> numsMap;vector<int> result;for(int i = 0; i < nums.size(); i++){numsMap[nums[i]] = i;}for(int i = 0; i < nums.size(); i++){if(numsMap.find(target-nums[i]) != numsMap.end() && numsMap[target-nums[i]] != i){// 找到了result.push_back(i);result.push_back(numsMap[target-nums[i]]);return result;}}return result;}
