春招打卡|两数之和

223 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

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

二、思路分析

  1. 最简单的方法是暴力法,两层循环枚举所有可能的和,但是时间复杂度O(n2)
  2. 可以使用map的键存储数的值,map的值存储数在数组中的下标。
  3. ab两个数的和为c,可以转换为求c-a的值为b
  4. 对于每一个数num,寻找在哈希表中是否存在target-x,将x再插入到哈希表中,这样复杂度可以降低为O(n),空间复杂度由于引入了哈希表复杂度变为O(n)

三、AC 代码

暴力解法

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

哈希表解法

func twoSum(nums []int, target int) []int {
    //创建哈希表存储数及数下标
    m := make(map[int]int)
    for i := range nums {
        //寻找的目标数
        v := target - nums[i]
        //如果目标在哈希表中存在,证明有两数之和,返回结果
        if index,ok := m[v];ok{
            return []int{index,i}
        }
        m[nums[i]] = i
    }
    return []int{-1,-1}
}

四、总结

两数之和是一道简单题目,使用了空间换时间的思想,将O(n2)的时间复杂度降低为O(n),同时带来了额外的空间复杂度为O(n),这道题主要学习如何使用哈希表,go实现的哈希表中数据是否存在使用ok语法,if index,ok:=m[v];ok ,ok为true,则执行代码段。