[算法基础] Hash-两数之和

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

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

解题思路

  1. 暴力求解
    按照最基本的解题思路,我们首先想到的是循环遍历整个数组,然后进行枚举尝试,找到相应的解。如果存在,则返回相应的下标。
    但是这种方式需要双层循环,时间复杂度为 O(n^2)

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
        for( var i = 0;i<nums.length;i++){
        	var temp = target - nums[i];
        	for( var j = i + 1; j < nums.length; j++){
    			if(nums[j] == temp){
    				return [i,j];
    			}
    		}
        }
    };
    
  2. 利用反转键值 利用数组减少查询时间
    在暴力破解法中,外层循环每走一步,内层循环就遍历一次。内层循环寻找差值十分的浪费时间,我们可以换一个思路,将新数组作为 Hash 表来使用,记录原数组值和键的对应关系,然后与外层循环的差值做比较。

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
    	var arr = [];
        for( var i = 0;i<nums.length;i++){
        	var temp = target - nums[i];
        	// 新数组中有无记录原数组的值恰好等于差值,如果有,则根据这个值,取出在原数组重的键
        	if(arr[temp] != undefined){
        		return [arr[temp],i]
        	}
        	// 如果没有,则将索引和值反转并记录
        	arr[nums[i]] = i;
        }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值