算法之两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

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

此题目是leetCode第一题,我刚写这个题目的时候想到的就是暴力破解法,当然这个也是平时用的比较多的方法(没有学习算法的时候),现在我就分享一下我现在所用的两种方法,方法很多,我还只知道两种,欢迎指正。

  1. 第一种方法就是暴力破解法,何为暴力破解法,就是通过两层遍历循环,直接判断nums[i]+nums[i+1]=target,如果相等,return这两数的下标,代码如下;
/**
 1. @param {number[]} nums
 2. @param {number} target
 3. @return {number[]}
 */
var twoSum = function(nums, target) {
    for(var i=0;i<nums.length-1;i++){
       for(var k=i+1;k<nums.length;k++){
           if(nums[i]+nums[k]==target){
               return [i,k]
              }
        }
    }
};

此方式虽然是解决了这一题,但是效率有点低,leetCode提交验证执行用时:172 ms,这个时间有浮动,但是也能反应出这个暴力破解确实速度有点慢,原因当然是两次循环的时候有重复计算,所以我又去探索了下新的解决思路,也就是第二种方式,空间换时间。
2. 空间换时间,何为空间换时间呢?我的理解就是,目标值是9,当我知道第一个数是2后,我知道我需要的数是什么了,那样我再去集合里去寻找另一个数,这样的遍历就极大的缩短了两个数的匹配时间,例子如下

 /**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let obj = {};
    for (let i = 0; i < nums.length; i++) {
        let diff = target - nums[i];
        if (obj[diff] >=0 ) {
            return [obj[diff], i];
        }
        obj[nums[i]] = i;
    }
};

总结:两数之和相对来说好理解一点,但是方式方法远不止我所理解的这两点,还有待提高与探索,欢迎分享指证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值