博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法刷题】1:两数之和
阅读量:6446 次
发布时间:2019-06-23

本文共 1289 字,大约阅读时间需要 4 分钟。

线性搜索:哈希表

题目描述

给定一个整数数组和一个目标值,找出数组中和目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:

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

思路与实现

按题意,对一个数组元素,需找到另一个互补数。问题的本质是,查找指定值是否存在于数组中。查找问题,理应想到查找为O(1) 复杂度的哈希表。

遍历数组将 元素值=>索引 的映射关系写入 map,之后遍历查找互补的数。实现:

// 方法一:两遍哈希遍历private int[] twoSum(int[] nums, int target) {        Map
map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], i); } for (int j = 0; j < nums.length; j++) { int complement = target - nums[j]; if (map.containsKey(complement) && map.get(complement) != j) { return new int[]{j, map.get(complement)}; } } throw new IllegalArgumentException("No two sum solution"); } // 一遍哈希表 public int[] twoSum2(int[] nums, int target) { Map
map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[]{map.get(complement), i}; } map.put(nums[i], i); } throw new IllegalArgumentException("No two sum solution"); }复制代码

总结

理解并抽象出本质,再选择最为合适的数据结构实现。

哈希表的增删查复杂度都是O(1)级别的,十分适合线性查找的问题。

转载地址:http://xutwo.baihongyu.com/

你可能感兴趣的文章
Spring 源码探险01 概念
查看>>
MySQL学习笔记
查看>>
mpvue小程序《校友足迹》成长记(一)
查看>>
智能聊天机器人语料库的设计编写(一)——Dialogflow
查看>>
译-Django restfull framework 中API版本的管理
查看>>
设计模式之代理模式
查看>>
对内对外烧钱,还顾自去门店化,独角兽爱屋吉屋终将归隐?
查看>>
@angular-devkit
查看>>
Spring Boot 注解
查看>>
iOS 用runtime为分类添加成员变量或属性
查看>>
React Diff理解
查看>>
# mac本 git 起别名
查看>>
<笔记>变量、作用域和内存问题
查看>>
Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系
查看>>
峰采 #2
查看>>
工程优化暨babel升级小记
查看>>
学习webpack4 - 样式处理
查看>>
编写的第一个POC代码
查看>>
Python 进阶之路 (十) 再立Flag, 社区最全的itertools深度解析(中)
查看>>
webpack4.0学习笔记
查看>>