打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
两数之和,程序员才懂的 TwoSum 和 Abandon !

01、题目分析

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

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

示例:

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

题目分析

首先我们拿到题目一看,马上可以想到暴力题解。我们只需要 “遍历每个元素 x,并查找是否存在一个值与 target - x 相等的目标元素。


由于该种解题思路过于简单,直接上代码(如果有问题请留言…):

func twoSum(nums []int, target int) []int {
for i, v := range nums {
for k := i + 1; k < len(nums); k++ {
if target-v == nums[k] {
return []int{i, k}
}
}
}
return []int{}
}

执行结果:

java版本:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i+1; j < nums.length; j++) {
                if (target - nums[i] == nums[j]) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

执行结果:

运行成功,但是该种解题方式的时间复杂度过高,达到了O(n²)。为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。我们可以想到用哈希表的方式,通过以空间换取时间的方式来进行。

02、题目图解

假设 nums = [2, 7, 11, 15], target = 9


<1> 首先,我们还是先遍历数组 nums,i 为当前下标。我们需要将每一个遍历的值放入 map 中作为 key。

<2> 同时,对每个值都判断 map 中是否存在 target-nums[i] 的 key 值。在这里就是 9-7=2。我们可以看到 2 在 map 中已经存在。

<3> 所以,2 和 7 所在的 key 对应的 value,也就是 [0,1]。就是我们要找的两个数组下标。

03、Go语言示例

根据以上分析,我们可以得到下面的题解:

func twoSum(nums []int, target int) []int {
    result := []int{}
    m := make(map[int]int)
    for i,k := range nums {      
        if value,exist := m[target-k];exist {
            result = append(result,value)
            result = append(result,i)
        }
        m[k] = i
    }
    return result
}

执行结果:

java版本:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            Integer value = map.get(target-nums[i]);
            if (value != null) {
                return new int[]{i, value};
            }
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

执行结果:


我把我写的所有题解都整理成了一本电子书,每道题都配有完整图解。点击即可下载

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
hash表、快排与二分查找:两数之和
两数之和(TwoSum)
leetcode算法题--数组-两数之和
1. Two Sum
Two Sum 问题的核心思想
519,单调栈解下一个更大元素 I
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服