什么时候考虑用哈希法:
当我们需要快速查找一个元素是否出现集合里时。
牺牲空间换取时间的做法, 需要额外的数组、set、map来存放数据。
leetcode题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
哈希表
哈希函数
哈希碰撞
- 拉链法
- 线性探测法
常见的三种哈希结构
当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。
- 数组
- set (集合)
- map(映射)
二叉搜索数(有序排列树)和红黑树
链表
链表相比数组,物理存储上非连续。但有灵活的内存管理,允许在链表任意位置上插入和删除节点
leetcode题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
单向链表:
- 单向链表结构
public class ListNode {
int val;
ListNode Next;
ListNode(int x) {val = x;}
}
- 单链表可以没有头结点(哑节点),但有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
- 链表中第一个节点的存储位置为头指针。(指针是一个变量,其值为另一个变量的地址)