leetcode小白刷题之旅----1.TowSum
仅供自己学习,有借鉴。
题目:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
思路:
1.第一想法两个嵌套for循环暴力求解,时间复杂度为O(n^2)
2.考虑到唯一问题是如何快速查找到对应的数之和为target,于是往查找速度快的数据结构考虑。数组和vector查找为O(1)的前提是知道下标和秩。是否有和python字典一样的数据结构能通过已知数字获得其位置呢。就想到了哈希桶。所以我们利用unordered_map 来完成查找的功能,为O(1)。如此总的RT则为O(n)。
第一次提交的代码
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map <int,int> m; //创建哈希桶 5 for(int i=0;i<nums.size();++i) 6 m[nums[i]]=i; //以nums的每个元素为key值,其秩为value 7 for(int i=0;i<nums.size();++i) 8 { 9 if(m.count(target-nums[i]) )//如果m哈希桶里有target-nums[i]的key值就返回1 10 { 11 return {i,m[target-nums[i]]}; 12 } 13 } 14 return {} ; 15 } 16 };
这种整体思路是没问题的,但是忽略了一种情况。问题出在第9行,m.count(target-nums[i])当nums为3,2,4。target为6时,count函数在6-3的参数下仍然会返回1。所以我们需要加上一个判断条件来跳过此情况。
考虑到m[nums[I]]的值都是num[I]所对应的秩,于是加上条件 m[target-nums[i]] != i,当m[3]的值即3的秩不为0时,即不为当前nums[I]的值时,条件为TRUE
最终代码
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map <int,int> m; 5 for(int i=0;i<nums.size();++i) 6 m[nums[i]]=i; //以nums[I]为key值,其秩为value创建哈希桶 7 for(int i=0;i<nums.size();++i) 8 { 9 if(m.count(target-nums[i]) && m[target-nums[i]] != i)//如果哈希桶里有target-nums[I]的key值并且该key值不为当前nums[I]的值 就返回1 10 { 11 return {i,m[target-nums[i]]}; 12 } 13 } 14 return {} ; 15 } 16 };
以上代码可更简洁,且能减少时间和空间开销。将两个for循环合并。
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map<int, int> m; 5 for (int i = 0; i < nums.size(); ++i) { 6 if (m.count(target - nums[i])) { 7 return {i, m[target - nums[i]]}; 8 } 9 m[nums[i]] = i; 10 } 11 return {}; 12 } 13 };
这个for合并后,最坏的情况还是所有的元素都需要映射,但其他情况都不会全部映射就能得出结果,并且因为是逐渐扩展的,不存在m[target-nums[I]]= i 的情况。

浙公网安备 33010602011771号