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 的情况。

posted @ 2021-01-23 10:09  Mrsdwang  阅读(59)  评论(0)    收藏  举报