当前位置: 首页 > news >正文

LeetCode两数之和

题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。

暴力解法:

public static int[] twoSum(int[] nums, int target) {
    int first = 0,end = 0;
    for (int i = 0; i < nums.length; i++) { 
        for (int j = 0; j < nums.length; j++) { // 两层for循环
            if(nums[i] + nums[j] == target){ // 一旦找到了
                first = j; // 拿出第一个的下标
                end = i; // 拿出第二个的下标
                break;
            }
        }
    }
    int[] result = {first,end}; // 两个下标放入结果数组
    return result; // 返回结果数组
}

该题难度描述为简单,因为非常容易想到使用两层暴力for循环,就能解出来,但这样时间复杂度就是O(n^2),消耗时长。

想法:既然有元素的比较以及下标的获取这样两者对应关系下的操作,就不难想到双列组合map,而map集合最经典的应用就是hashMap,且由于需要遍历元素值,hashMap在理想状态(无hash冲突)时查找元素时间复杂度是O(1),明显可以提高速度。

思路:我们可以创建一个hashMap用来存储nums数组元素值(key)以及对应的下标(value),我们遍历数组,做两个操作,一个是按格式存入键值对,一个是将target减去正遍历到的元素值,作为一个key值查找map里是否已经存入该key值,如果有,那么这个key值对应的value值和正遍历的值的数组下标组成的数组就是我们需要的输出结果。

注意:因为题目并未限制元素不可以重复,且hashMap如果有重复key值,那么不会存在两个key,而是后来的value值替换掉原来的value值,为了保证特殊情况下两个都取出来或者说被替换前的取出来,我们放入结果数组里的后来者应该是数组元素对应的下标,而不是放进去之后取出来的value。(这样就在替换前就拿到结果了)

hashMap解法:

private static int[] twoSum(int[] nums,int target) {
    int[] result = new int[2]; // 创建结果数组
    // 新建一个hashMap
    HashMap<Integer,Integer> map = new HashMap<>();
    // 遍历数组
    for (int i = 0; i < nums.length; i++) {
        if(map.containsKey(target - nums[i])){ // 因为结果是唯一,所以一旦存在即两个都存在
            // 输出数组
            // 此处注意后者是i而不是get(key)得到value,因为如果key是重复的,后value会替换前value
            result = new int[]{map.get(target - nums[i]), i};
        }
        // 把元素值及对应下标存入数组
        map.put(nums[i],i);
    }
    return result;
}

 

 

相关文章:

  • 稀疏数组
  • 队列
  • 单链表LinkedList的增删改查
  • 双向链表和环形链表(单向和双向)约瑟夫环实例
  • IO流概述+字节输出流
  • 字节输入流
  • 字符流(字符输入流和字符输出流)
  • IO异常的处理
  • 栈Stack(数组模拟、单链表模拟)
  • 属性集合Properties
  • 缓冲流
  • 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
  • 序列化与反序列化和transient瞬态关键字
  • 打印流
  • 前缀(波兰)、中缀、后缀(逆波兰)表达式
  • CSS 三角实现
  • css的样式优先级
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • express + mock 让前后台并行开发
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Redis中的lru算法实现
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 工作中总结前端开发流程--vue项目
  • 将 Measurements 和 Units 应用到物理学
  • 如何实现 font-size 的响应式
  • 数组大概知多少
  • 运行时添加log4j2的appender
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)Android布局类型(线性布局LinearLayout)
  • (原創) 物件導向與老子思想 (OO)
  • (转)http-server应用
  • (转)nsfocus-绿盟科技笔试题目
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Standard 的管理策略
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net反编译的九款神器
  • .NET运行机制
  • .sh 的运行
  • //解决validator验证插件多个name相同只验证第一的问题
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [acm算法学习] 后缀数组SA
  • [bzoj1912]异象石(set)
  • [C++]二叉搜索树
  • [CTF]2022美团CTF WEB WP
  • [Django ]Django 的数据库操作
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [flask]http请求//获取请求头信息+客户端信息
  • [hdu 4552] 怪盗基德的挑战书
  • [IE9] GPU硬件加速到底是实用创新还是噱头