两数之和

本人是个菜鸟,也非科班出身,尝试写一下自己做过的leetcode题目,只是将自己的想法记录下来,可能有的理解有偏差,各位大佬可以留言批评指正,一起进步。先从简单的第一题开始吧(C++)。

题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例:给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

在没做leetcode之前,就一直听说过这个题库,一般都是面试刷题用的,所以给我的感觉都是每个题目都不容易,都有技巧。在开始做leetcode的题目时,我就想着这题有什么巧技巧而忽略了最简单的方法。其实在不考虑空间,时间复杂度要求下,最直接的解法就是暴力法:使用两层循环,判断每层循环的值加起来等于target,然后对应返回索引值即可。

暴力法的时间复杂度为O(N2)。当然也可以使用一层循环,但是另外要做的工作就是将所遍历的元素nums[i]与其索引值 i 对应保存在map中,每循环一个元素的时候,先在map中找一下target-nums[i]是否在map中,如果存在,则返回map[nums[i]]和i; 如果不存在,则将nums[i]和i保存在map中(也可以是将target-nums[i]的值与i对应保存, 下面写的代码就是)。

        // 暴力法        
        vector res;        
        for(int i = 0; i < nums.size()- 1; ++i){            
        	for(int j = i+1; j
       // 使用map, 一层循环 
       vector res;        
       for(int i = 0; i < nums.size(); ++i){            
       	   int a = target - nums[i];            
       	   if(res_map.find(nums[i]) == res_map.end()){  // do not search successfully                
       	       res_map[a] = i;                           
       	   }else{                
       	       res.push_back(res_map[nums[i]]);                
       	       res.push_back(i);                
       	       break;            
       	   }
        }
        return res;

你可能感兴趣的:(Leetcode,leetcode,c++,数据结构,算法)