初认识:HashMap = 数组 + 单向链表
为什么呢?
数组方便查找,如nums[i],但难增删改
链表方便增删改,但难查找(如单链表需要从head节点开始逐级向下查找)
hashMap集结二者优势,是最优选
HashMap初认识
1.你以为的 简单的 key ——value
2.实际上 :由key算出hashcode,几组一样hashcode的键值对分到一起,原理图例:
可以看作key为4,8的同学经过hashcode的换算,分到了第0组-》方便查找
key value 中其实是存在链表节点的,(这就是说hashMap其实包含了单向链表的功能)
HashMap的使用
1.创建系统自带的HashMap类
val map :HashMap<Key类型,Value类型> = HashMap()
2.往map添加键值对
map.put(Key值,Value值)
3.通过Key拿到map里的value
map.get(Key值)
4.由key || value遍历hashmap判断是否存在这个key || value
map.containsKey(Key值 || value值)
Leetcodel两数之和问题
由于数据单一,并且涉及查找数据,所以这里哈希表和数组同样方便
源码(含注释和检验代码)
class Solution { fun twoSum(nums:IntArray, target: Int): IntArray? { val map :HashMap<Int,Int> = HashMap() //i 只是代表索引值,不占内存, 且indices代表 0 <= i <= nums.size for ( i in nums.indices){ //通过判断键是否相同,来获取值 if (map.containsKey(target - nums[i])){ // 终端输出,通过key获取哈希表的value(注意我们把数组值放入Key,把对应索引值放入value) map.get(target - nums[i])?.let { intArrayOf(it,i) }.also { print("${it?.get(0)},${it?.get(1)}") return it } } //将不符合条件的组合封装成键值对,加到map map.put(nums[i],i) } //此时正常情况下不再有返回值,抛出异常即可代替return throw IllegalAccessException("no such two solutions") } }