NO.1————哈希表Hash Map
比如解决:对应类的问题------->如此题"hash map解决一 一对应问题(链接)"
使用的是指针数组(数组的元素是是指针),每一个指针的索引表示的是一个标志,这个标志的地址链接的是它所对应的内容。
比如要表示'a' 对应一个 字符串"abcd",数组元素装入的就是'a',而改元素的地址后的链表表示的是'a'所对应的字符串"abcd"。
NO.2————滑动窗口————减少循环重复次数,数组中定长问题
比如解决:数组中k个值相加,求最值的问题等等
例题:
暴力解法:组合、相加、比较
滑动窗口技巧:
减去1、再加上3
减去4、加上4.以此类推
NO.3————回溯算法————避免多余的操作,进入一条路后发现不合适就回头
比如解决:全排列问题、八皇后问题等
例题:"1 2 3"的全排列问题
给这三个结构一般化:给每一个圈编号,编号是可以数的、名字是不可以数的。
每一层都可以看作给函数 f() 传入对应的参数
实质上就是递归:
f(0)调用f(1);
f(1)调用f(2);
f(2)调用f(3);
到达f(3)停止。
写成递归式:
在进行下一层之前,进行检查,检查是否有重复,有重复的话就不需要再呼叫下一层,直接跳过
使其具有一般性
NO.4 ————链表专题
常用的解题技巧有:
-
快慢指针、栈————返回倒数第k个节点
-
快慢指针——————寻找中间节点
-
快慢指针——————验证是否存在环(拓展:求环的长度)
NO.5 ————求解农夫过桥问题(链接)————四种解决方案:过程回溯法、图的遍历、状态回溯法、状态队列搜索法
问题:一个农夫带着一匹狼、一只羊、一颗白菜要过河,只有一条船而且农夫每次最多只能带一个动物或物品过河,并且当农夫不在的时候狼会吃羊,羊会吃白菜,列出所有安全将所有动物和物品带过河的方案。
1. 过程回溯法
把人、狼、羊、白菜看成A、B、C、D。过河的时候从ABCD中选两个过河,在
选一个回来。若发生狼跟羊、羊跟白菜在同一个岸边,且农夫不在场,则回溯.
2. 图的遍历
设从南岸到北岸,在南岸ABCD的各个状态是(用二进制表示):0000,在
北岸的时候各个状态是:1111。所以过河问题就是从0000起始状态到1111最终状态的
过程。易得,总共有16中状态。然后把每一种状态看成图的一个结点,把可以连通的
结点用有向边连起来,就构成的一个有向图。从0000这个结点遍历(深度优先或者广
度优先)图,遍历到1111结点则找到解。
*
3. 状态回溯法
设从南岸到北岸,在南岸ABCD的各个状态是(用二进制表示):0000,在
北岸的时候各个状态是:1111。所以过河问题就是从0000起始状态到1111最终状态的
过程。易得,总共有16中状态。从第一种状态0000开始搜索,搜索当前状态下可以到达的
状态,搜索到一个则把这个状态看成当前状态,继续搜索。若出现当前状态搜索无可到达
的状态或已遍历所有搜索出来的状态,则回溯。直到到达1111状态。
4. 状态队列搜索法
跟思路3类似,只是搜索的方式不一样。思路3中用栈的思想进行深度搜索
这里采用队列的思想进行广度搜索。
需要熟悉掌握位运算符:
左移<< | 1001 → 0010 |
右移>> | 1100 → 1110 ; 0101 → 0010 |
按位与& | 1100 & 0101 = 0100 ; 1110 & 1100 = 1100 |
按位或 | | 1100 | 0101 = 1101 ; 1110 | 1100 = 1110 |