leetcode算法题1:两数之和

题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

解析:

方法1:暴力法很简单。遍历数组中的每个元素 ,并查找是否存在一个值与 nums[x]+ nums[y]=target相等的目标元素。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    var result=[];  //声明一个空数组
    for(var i=0;i<nums.length;i++){ //遍历数组
        for(var j=i+1;j<nums.length;j++){
            var sum=nums[i]+nums[j];
            if(sum===target){ //判断两数之和是否与目标值相等
               result.push(i,j);
               return result;
            }        
        }
    }
};

twoSum([2, 7, 11, 15],9)

该方法的复杂度分析:

  • 时间复杂度:O(n^2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n) 的时间。因此时间复杂度为 O(n^2)。

  • 空间复杂度:O(1)。 

方法2:使用查找表来解决该问题。

设置一个map容器record用来记录元素的值与索引

遍历数组nums

扫描二维码关注公众号,回复: 4211328 查看本文章
  • 每次遍历时使用临时变量complement用来保存目标值与当前值的差值

  • 在此次遍历中查找record,查看是否有与complement一致的值,如果查找成功则返回查找值的索引值与当前变量的值i

  • 如果未找到,则在record保存该元素与索引值i

   var twoSum = function(nums, target) {
        var map = new Map();
        var result=[];
        for (var i = 0; i < nums.length; i++) {
            map.set(nums[i], i); //遍历数组,将值放到map中
        }
        for (var j = 0; j < nums.length; j++) {
            var complement = target - nums[j]; 
            if (map.get(complement)&& map.get(complement) != j) { //判断map中是否有符合的值且下标值不重复
                result.push(j,map.get(complement));
                return result;
            }
        }
    };
    twoSum([1, 3, 4,2],6);

该方法的复杂度分析:

  • 时间复杂度:O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1),所以时间复杂度为 O(n)。

  • 空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素。 

猜你喜欢

转载自blog.csdn.net/MySunshine07/article/details/84316229