leetcode(力扣)第一题:两数之和_C++

//暴力求解 O(n*n) O(1)
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
	for(int i=0; i<nums.size()-1; i++){
		for(int j=i+1; j<nums.size(); j++){
			if(nums[i]+nums[j]==target)
				return vector<int>{i, j};
		}
	}
	return vector<int>{0, 0};//error: non_exit
    }
};
//两遍哈希 O(n) O(n)
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
	unordered_map<int, int> nums_map;
	for(int i=0; i<nums.size(); i++)
		nums_map[nums[i]]=i;
	for(int i=0; i<nums.size(); i++){
		auto it=nums_map.find(target-nums[i]);//返回一个正向迭代器
		if(it!=nums_map.end()&&it->second!=i)//存在&不重
			return vector<int> {i, it->second};
	}
	return vector<int>{0, 0};//error: non_exit
    }
};//key的哈希值作为哈希表的下标,键值对的值另算
//一遍哈希 O(n) O(n)
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
	unordered_map<int, int> nums_map;
	for(int i=0; i<nums.size(); i++){
		auto it=nums_map.find(target-nums[i]);//返回一个正向迭代器
		if(it!=nums_map.end())//存在
			return vector<int> {i, it->second};
		nums_map[nums[i]]=i;
	}//在插入之前计算可以避免重复
	return vector<int>{0, 0};//error: non_exit
    }

少量输入数据之下,暴力求解的表现反而比哈希表好得多。

你可能感兴趣的:(力扣,c++,哈希表,leetcode)