索引请参考:系列目录
题目:
- 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
- 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
- 示例:输入nums = [2,7,11,15],target = 9
- 输出:[0,1],原因: nums[0] + nums[1] = 2 + 7 = 9
分析:
思路1:
- 暴力法:两个循环进行不断的判断,若满足条件返回索引值。否则返回空数组
思路2:
- 利用unordered_map的成员函数count进行判断,在利用其hash的性质返回索引值
思路1:
std::vector<int> twoSum2(const std::vector<int> & nums, const int target) {
for (int i = 0; i < nums.size(); i++)
{
for (int j = i + 1; j < nums.size(); j++)
{
if (nums[i] + nums[j] == target && i != j)
return{ i,j };
}
}
return{};
}
leetcode运行结果:
思路2:
std::unordered_map<int, int>coll;
int size = nums.size();
for (int i = 0; i < size; i++)
coll[nums[i]] = i ;
for (int i = 0; i < size; i++)
{
if (coll.count(target - nums[i]) > 0 && i != coll[target - nums[i]])
return{ i,coll[target - nums[i]] };
}
return{};
leetcode运行结果:
评注:从理论上分析,思路2的时间复杂度为O(nlogn),而思路2的时间复杂度为O(n^2),应该时相差了一个级别的效果,但是实际运行结果却与理论设想正好相反。本人才疏学浅,至今还是不理解leetcode和牛客测试程序的运行时间理论依据是什么。。。
这道题的节体思路和剑指offer面试题57:和为S的两个数字相似。具体请参考和对比这两道题~
【每天多了解一点点】