leetcode题目

1.回溯法:

皇后问题,电话键问题,都可以用回溯法解决。

什么是回溯法?

回溯法=“暴力枚举+约束限制条件(这部分是为了从所有结果中只挑出我们需要的结果,可以看成是一种剪枝)。

怎么使用回溯法?

参考我博客的回溯法,用里面的框架来搭代码就行,典型例题有排列树或者子集树


2.动态规划:

word break问题,

什么是动态规划?

典型动态规划问题=划分状态+递推关系+起始条件。类似于数学归纳法,思路的关键在于找到合适的状态划分。进而找出递推关系,问题自然就迎刃而解。具体可以参考我的博客的动态规划,国王的故事有助于理解动态规划思想。

怎么做动态规划?

找思路的时候:从后往前递推地想。

实现代码的时候:从前往后非递归地写。


3.分治法:

典型例子,二叉树深度的递归求法。

分治法,其实思路跟动态规划基本一样,只不过用递归的方式去解决问题。

总结分治法的框架就是:子状态划分(相当于动态规划的状态划分函数,这个比较关键,找到了,问题基本就解决了,有不少道题都是划分成左半部分和右半部分然后递归)+递归关系式(相当于动态规划的递推关系)+终止条件

分治法相对难一点。


4.栈:

大多数情况处理字符串,特别是字符串存在特殊字符,比如"/a/./b/../../c/", => "/c"。以及储水池最大容量那种题目。二叉树的前中后序的非递归遍历。

怎么使用栈?

关键点:想清楚怎么将问题用栈的结构来应用到题目+出栈前注意判断栈空

基本上所有的递归问题都可以用栈来转换,只要适当包装下元素作下标记就行


5.双指针(反向滑动):

典型题目:leetcode的N sum问题。

用双指针作为滑动窗口范围。前后指针异步相向滑动,使得窗口逐渐缩小。

N sum问题都可以用”外层循环+...+最后两层用前后指针“的方法解决。

N sum closest问题可以用”外层循环+...+最后两层用杨氏矩阵”的方法解决。

另外,如果能将N sum转换成two sum,用hash table效果肯定是比较好的。


6.双指针(同向滑动):

典型题目:209题的Binary Search。

用双指针作为滑动窗口范围。前后指针异步同向向前滑动,使得窗口总体一直往前遍历。


7.二分法:

循环数组的查数问题。

第4题求两个有序数组的中位数问题。

一般应用于有序数组、序列。递归和非递归写法都得掌握。如果一个数组是无序的,就要想方法将其变成有序的,然后再进行二分法的应用,比如讲一个无序数组进行前N项和累计构造出一个新的有序数组。比如209题的Binary Search


8.深度优先搜索DFS:

回溯法挺像,代码框架基本都是一样的。要说唯一不同的,就是一般深度优先搜索应用于树、图这种原先各个节点就已经存在特定链接关系的网络中,所以会加上一些是否访问过之类的辅助变量。比如101.Symmetric Tree112.Path Sum

掌握了回溯法,DFS也就基本OK了。


9.广度优先搜索BFS:

主要就是用队列来解决诸如最短距离、最短路径的问题。比如二叉树的层次遍历102.Binary Tree Level Order Traversal


10.图:

掌握邻接矩阵、邻接表的链表和数组形式、并查集。典型题目是任务队列。也就是给出一堆任务和任务依赖关系,求一个任务完成顺序。比如207.Course Schedule


11.哈希hash

思想类似函数。STL里面的实现有unordered_set,unordered_multiset, unordered_map,unordered_multimap。

掌握几个常用接口函数:

dict.insert(make_pair(key,value));

dict.erase(key);

dict.count(key);

dict.find(key);

遍历元素:

unordered_set<int>::iterator iter=dict.begin();

set的是*iter;

unordered_map<int,bool>::iterator iter=dict.begin();

map的是iter->first与iter->second;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值