num1
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
解法1: 直接的解法,两层循环,O(n2)的时间复杂度。
vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret; for(int i=0 ; i<nums.size() ; ++i) { for(int j=i+1; j<nums.size(); ++j) { if(nums[i] + nums[j] == target) { ret.push_back(i); ret.push_back(j); return ret; } } } return ret; }
解法2: 想要从两层循环变为一层循环,需要借助外部空间,将数据再保留一份出来。
vector<int> twoSumTwoLoopHash(vector<int>& nums, int target) { map<int, int> mp; vector<int> solution; for(int i=0; i<nums.size(); ++i) // mp.emplace(std::make_pair(nums[i], i)); mp[nums[i]] = i; for(int i=0; i<nums.size(); ++i) { if(mp.count(target-nums[i]) != 0 && mp[target-nums[i]] != i) { solution.push_back(i); solution.push_back(mp[target-nums[i]]); break; } } return solution; }
解法3: 解法2将时间复杂度从O(n2)降低到O(n)。还可以将两次for循环减少为一个。
vector<int> twoSumOneLoopHash(vector<int>& nums, int target) { unordered_map<int, int> mp; vector<int> solution(2, -1); for(size_t i=0; i<nums.size() ; ++i) { if(mp.count(target-nums[i]) != 0 && mp[target-nums[i]] != i) { solution[0] = i; solution[1] = mp[target-nums[i]]; break; } mp[nums[i]] = i; } return solution; }