题解 | #两数之和#(附带图解)

两数之和

http://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f

思路:

从题中给出的有效信息:

  • 找出下标对应的值相加为target
  • 数组中存在唯一解

故此 可以使用 直接遍历 或者 hash表 来解答

方法一:直接遍历

具体做法:
循环遍历数组的每一个数,如果遍历的两数之和等于target,则返回两个数的下标;

import java.util.*;
public class Solution {
    /**
     * 
     * @param numbers int整型一维数组 
     * @param target int整型 
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        // write code here
        int n = numbers.length;
        int[] res = {-1, -1};
        //遍历数组
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                //判断相加值是否为target
                if (numbers[i] + numbers[j] == target) {
                    res[0] = i+1;
                    res[1] = j+1;
                    //返回值
                    return res;
                }
            }
        }
        return res;
    }
}

复杂度分析:

  • 时间复杂度:O(n^2) 遍历两次数组
  • 空间复杂度:O(1) 未申请额外空间

方法二 hash表

具体做法:
使用Map来降低时间复杂度,遍历数组,如果没有 (target - 当前值) 就将当前数字存入哈希表,如果有,返回该数字下标即可。

哈希表可以优化第二遍循环中对元素的检索速度,
具体过程如下图所示:
图片说明

import java.util.*;
public class Solution {
    /**
     * 
     * @param numbers int整型一维数组 
     * @param target int整型 
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        // write code here
        HashMap<Integer, Integer> map = new HashMap<>();
        //遍历数组
        for (int i = 0; i < numbers.length; i++) {
            //将不包含target - numbers[i],装入map中,包含的话直接返回下标
            if(map.containsKey(target - numbers[i])) 
                return new int[]{map.get(target - numbers[i])+1, i+1};
            else 
                map.put(numbers[i], i);
        }
        throw new IllegalArgumentException("No solution");
    }
}

复杂度分析:

  • 时间复杂度:O(n) 一次遍历hash索引查找时间复杂度为O(1)
  • 空间复杂度:O(n) 申请了n大小的map空间
全部评论
方法1超时
8 回复 分享
发布于 2022-01-27 21:36
两层遍历的方法不行,自测能过,提交通过不了
1 回复 分享
发布于 2023-06-20 19:30 浙江
作者的写法真的妙,我是菜狗,为了避免key重复的问题,用了两个哈希表
1 回复 分享
发布于 2022-12-07 11:27 山西
直接遍历会超时
点赞 回复 分享
发布于 2025-10-25 10:19 广东
自己不用实现哈希表算法,直接用现成的map也可以吗?
点赞 回复 分享
发布于 2025-08-22 22:30 辽宁
方法二要得到Map中的值不是还需要遍历吗?
点赞 回复 分享
发布于 2023-04-20 10:56 陕西
方法一没有升序排序
点赞 回复 分享
发布于 2023-03-14 10:35 上海
如果用例中有重复的value的话就不适用了吧
点赞 回复 分享
发布于 2022-07-09 21:21
如果输入是,[2,2,2]4的时候呢?
点赞 回复 分享
发布于 2022-07-08 16:08

相关推荐

评论
70
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务