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

两数之和

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

相关推荐

行云流水1971:优化后简历(以 “后端开发岗” 为目标) 基本信息 姓名:XXX | 电话:XXX | 邮箱:XXX 求职意向:后端开发工程师 | 意向城市:XXX 教育经历 2023.09-2027.07 XX 大学 | 计算机科学与技术 | 本科 核心课程:Java 程序设计、数据库原理、计算机网络、数据结构(成绩均 85+) 技能关联:掌握 Java 基础语法、MySQL 增删改查,为后端开发奠定技术基础 项目经历 项目 1:小说推荐 - 大数据智能推荐平台 | 后端开发 | 2025.09-2025.12 技术栈:Java、SpringBoot、MySQL、Redis、Kafka 核心动作: 参与用户行为数据采集模块开发,用 Kafka 实现日志数据异步传输,峰值吞吐量提升 40%; 基于 MySQL 设计用户 - 小说关联表,配合 Redis 缓存热门推荐列表,页面响应时长从 300ms 缩短至 120ms; 成果:支撑日均 1000 + 用户访问,推荐内容点击率较初始版本提升 25%。 项目 2:在线博客 - 个性化博客分享平台 | 后端开发 | 2025.03-2025.06 技术栈:Java、SpringBoot、MyBatis、MySQL 核心动作: 开发博客发布 / 编辑接口,通过 MyBatis 实现数据持久化,接口成功率达 99.8%; 设计用户权限控制逻辑,区分普通用户 / 管理员操作权限,避免非法内容发布; 成果:完成 5 个核心功能模块开发,实现博客内容的全流程管理。 技能证书 技术栈:熟练使用 Java、SpringBoot、MyBatis 进行后端开发;掌握 MySQL 数据库设计与优化、Redis 缓存应用 工具:Git 版本管理、Postman 接口测试 自我评价 具备 Java 后端开发基础,参与 2 个完整项目的后端模块开发,能独立完成接口编写、数据持久化等工作;熟悉 SpringBoot 等主流框架,可快速上手企业级开发流程,具备良好的代码规范与逻辑思维。 需要我帮你补充项目的量化成果细节(比如接口性能、用户数据等)吗?若需要更精准的岗位适配优化,可私信沟通。
点赞 评论 收藏
分享
评论
70
16
分享

创作者周榜

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