巧解两数之和(LeetCode 热题)

143 阅读1分钟

相信大家在解决这道题的第一反应应该是使用两次循环直接暴力破解!

暴力破解当然是没问题的,笔者第一想到的也是这个方法,毕竟暴力破解也是解!

暴力破解

直接遍历

var tweSum = 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方法

var twoSum = function(nums, target) {
    // 遍历每个元素
    for (var i = 0 ;i < nums.length; i++){
        // 在数组中查询是否具有target - nums[i]的数
        var res = target - nums[i]
        var index = nums.indexOf(res,i+1)
        // 找到直接返回,没有继续下一轮
        if(index !== -1){ 
            return [i, index]
        }
    }
}

以上两种方法的本质其实差不多,都是暴力破解

使用哈希表特性

var twoSum = function(nums, target) {
    var obj = {}
    for(var i = 0; i < nums.length; i++){
        if(obj[nums[i]] !== undefined){
            return [obj[nums[i]], i]
        }
        obj[target - nums[i]] = i
    }
}
  • 使用一个对象 obj 来存储数组 nums 中的元素和其对应的下标。

  • 遍历数组 nums,对于每个元素 nums[i]

    • 检查 obj 中是否已经存在 nums[i] 的补数 target - nums[i]
    • 如果存在,说明找到了两个数的和等于 target,返回它们的下标 [obj[nums[i]], i]
    • 否则,将 target - nums[i] 和其下标 i 存入 obj

总这个解决方案利用哈希表的查找特性,相比于暴力解法的 O(n^2) 时间复杂度,这个解决方案更加高效,时间复杂度为O(n)