题目:
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回[0,1]
思路:
很简单的想法就是遍历两次的O(n^2)的算法,暂时想不出,想看看吧。
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int length=nums.size(); for(int i=0;i<length;i++) for(int j=i+1;j<length;j++) { if((nums[i]+nums[j])==target) { return vector<int>{{i,j}}; } } return vector<int>{{-1,-1}}; } };
结果果然不太好,看看大佬的:
× 关闭 执行用时为 4 ms 的范例 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { std::vector<int> vec; vec.reserve(2); std::unordered_map <int, int> map; map.reserve(nums.size()); int count = 0; for( int i : nums ) { auto&& is = map.find( target - i ); if ( is != map.end() ) { vec.push_back(count); vec.push_back( (*is).second ); return vec; } else { map[i] = count; count++; } } return std::move(vec); } };
大佬果然是大佬,简要解释一下:用一个无序map来检索,key是数字,保证了唯一性,不复用,value是下标,方便在找到时push_back回去。666