优化算法的探索:从暴力法到巧用对象的key和value

118 阅读2分钟

前言

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。 示例 1:

输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 

代码

代码一(暴力法)

通过两个for循环嵌套实现:

nums = [2,7,11,15], target = 9;

var twoSum = function(nums, target) {
    for(var i = 0; i < nums.length; i++) {
    for(var j = i + 1; j < nums.length; j++) {
        if(nums[i] + nums[j] == target) {
            return [i,j]
        }
    }
}
};

代码二(公式法)

通过数组自带的indexOf方法,查找指定字符串的位置。indexOf 是一种常见的字符串方法,用于查找字符串中指定子字符串的位置(索引)。它返回指定子字符串在原始字符串中第一次出现的位置,如果没有找到则返回 -1。这个方法通常用于搜索特定字符或子字符串在字符串中的位置。nums.indexOf(res, i+1)是从第 i + 1 个位置开始往右查找和 res 相同的数值,如果不能找到就不会执行 if 语句;若能找到则执行 if 语句,并返回数组下标。注: 虽然表面上只用了一层循环,但实际indexOf方法实质上就是循环遍历,所以这种方法效率并不比第一种方法效率高多少。

nums = [2,7,11,15], target = 9;

var twoSum = function(nums, target) {
    for(var i = 0; i < nums.length; i++) {
     var res = target - nums[i]
     var index = nums.indexOf(res, i+1)
     if(index != -1) {
        return [i, index]
     }
    }
};

代码三(对象法)

定义一个diff对象,存放的key为 target - nums[i] 的差值,value为 nums[i] 的下标,通过for循环遍历nums中的数值,并且判断 diff 对象中是否存在该值,若存在则返回下标;如果不存在则在对象中加入 target - nums[i] 的差值作为key,并且把 i 下标作为value。注: 由此可见该法只用到一层循环,比前两种方法效率更高。

nums = [2,7,11,15], target = 9;

var twoSum = function(nums, target) {
 var diff = {}
 for (var i = 0; i < nums.length; i++) {
    if(diff[nums[i]] != undefined) {  //查找对象中是否存在值,是不需要循环的
        return [diff[nums[i]],i]
    }
    diff[target - nums[i]] = i;
 }
};

image.png