dcddc

西米大人的博客

0%

算法题思路总结

引言

算法题,无外乎两类:
一类考对基本算法实现的掌握,另一类考运用算法解决实际问题。

第一类:

排序
快排、归并排序、堆排序怎么实现的?
查找
有序数组的二分查找、二叉查找树怎么实现的、红黑树是什么?
字符串
KMP会吗?

鄙人不才,只能想到算法世界里的冰山一角。这些基本算法的实现过程中的思想,需要掌握!最好能用自己的话讲明白。

第二类:
运用数据结构解决实际问题。这种题目有两个考察点:

1、找到一种解决问题的算法
2、实现这种算法,需要用到哪些数据结构?如果你是个JAVA程序员,这些数据结构你能灵活使用吗?

有以上这种感触是在我做了一道扫描线的问题之后。这道题的算法不难,但是找到算法后,运用哪种数据结构呢?自己实现会很耗费时间,所以要做到这两点:

1、熟练掌握常用数据结构的特点,比如堆是一种优先队列的实现你知道吗?
2、熟练掌握编程语言中,数据结构对应的实现是什么?比如你知道JAVA中用PriorityQueue实现了堆吗?

如果你想更精通算法与数据结构,你还需要做到:
熟悉编程语言中对数据结构的实现采用了何种算法,性能怎么样


路漫漫其修远兮~~~,所以接下来进入正题,介绍常用的解题思路

贪心

当我们求解一个问题时,如果能最大化利用我们当前获得的信息,得到当前情况下的最优解,那么当我们迭代完所有的已知条件后,最后的结果就是我们想要的。

题目链接:
加油站
买卖股票的最佳时机II
买卖股票的最佳时机
最大子数组
主元素

堆又名“优先队列”,可以加入元素(因为是队列),也可以返回最值(体现优先)
当你的解题思路中,需要:将元素加入队列中暂存、将队列中的最值元素取出来,可以考虑使用堆这种数据结构!

题目链接:
排序矩阵中从小到大第k个数
数据流中位数
滑动窗口的中位数
大楼轮廓
合并k个排序链表
丑数II

DP

题目链接:
最小调整代价
背包问题II
背包问题

递归

题目链接:
二叉树的所有路径
最近公公祖先
二叉查找树迭代器
删除二叉查找树的节点
二叉查找树中搜索区间
生成括号

Trie

实现Trie
异或

分治

翻转二叉树
二叉树的最大深度
合并k个排序链表
两个排序数组的中位数
第k大元素

数学题

落单的数 I II III
A+B问题
尾部的零

逻辑题

翻转字符串
链表求和
两数之和
带重复元素的子集
子集
带重复元素的排列
全排列
带最小值操作的栈
旋转字符串
二叉树的序列化和反序列化
合并排序数组
统计数字
按层打印二叉树
次数的期望值

KMP

字符串查找

打印[]对
二叉查找树迭代器

BFS

单词变换