LeetCode系列-1.两数之和

描述:

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

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

给定 nums = [2, 7, 11, 15], target = 9

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

 思路一:暴力解法。可以先假设num是目标两个数之一,则另一个数就是target - num,在数组中遍历除了num之外的其他数,看是否与target - num 相等。可以提升效率的是,num从数组第i位开始遍历,第二层循环从i + 1开始循环。此法时间复杂度O(n^2)

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    var len = nums.length
    for (let i = 0; i < len; i++) {
        var temp = nums[i]
        var ind1 = i
        if (i !== len - 1) {
            for (let j = i + 1; j < len; j++) {
                if (nums[j] === target - temp) {
                    var ind2 = j
                    return [ind1, ind2]
                }
            }
        }
    }
    return [ind1, ind2]
};

思路二:可以用一个temp数组存放原nums数组内的数的下标。以示例nums为例,nums[0] = 2,则temp[2] = 0。见代码。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
    var temp = []
    for(let i = 0; i < nums.length; i++){
        var num = target - nums[i] //要寻找的目标数
        if(temp[num] !== undefined){  //目标数曾经出现过 
            return [temp[num], i]
        }else temp[nums[i]] = i  //目标数没有出现过,就将当前数的下标存进temp里
    }
    return []
};

此法时间复杂度可以降到O(n) ,但空间复杂度也提高了,新建的temp的大小取决于原nums数组里数的大小

发布了8 篇原创文章 · 获赞 0 · 访问量 238

猜你喜欢

转载自blog.csdn.net/lll_y1025/article/details/104484149