解题方法不优秀是因为需要变量去记录曾经使用过的数据,使用记录数据的变量越少代码越优秀
总而言之需要找到做题的关键点和突破点,以下几种方法的使用都是为了找到解题关键点。
一:将问题抽象化即图像化:
135. 分发糖果
二:问题小规模化
135. 分发糖果
题解
解析:
题目是给每个孩子分发糖果,且要糖果总数最少。
理解:
首先整体孩子分糖果的情况分为每个孩子分糖果的情况。
每个孩子分糖果的情况,又分为左孩子的约束造成的分糖果的情况,右孩子的约束造成的分糖果的情况。
具体:
首先整体孩子分发糖果分解为每个孩子分恰当的糖果数,使得糖果总数最少。
因为有规则的约束,所以分解成当前孩子左孩子的情况,当前孩子右孩子的情况。
既要满足左遍历的情况,又要满足右遍历的情况,此时就要选择俩种情况中的的最大值。
三:初始情况并不需要考虑,整体过程是对的,结果是对的就行
406.根据身高重建队列
题解:
理解:
首先按身高全排,然后依次安排每个人的位置,此时每个人的位置是正确的,结果是正确的。就行了。至于为什么要按身高全排,只是为了安排每个人的位置更加简单。若不全排还得比较每个位置的值。
四:代码写完之后,每一种情况在脑海中模拟一遍,看是否有特殊情况没有处理
- 一般来说特殊情况是最后一个元素的处理,头元素的处理,为0的情况…
五:对于一个题目的解法来反向思考
当一个题目解法代码实现起来时记录数据的变量越多就代表这个代码不好,此时可以反向思考,当前思路:应该留下哪些区间?反向思路:应该舍弃哪些区间?
435. 无重叠区间
题目:
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
题解:
有很多区间重叠你需要移除恰当的区间(怎么恰当呢,看起来就复杂(其实就是两种情况,不过要遍历所有同时需要记录下来一些数据)),我们不妨想一想应该留下哪些区间,那么与这个区间重叠的就是应该丢弃的区间。
重叠区间的基准(即与哪一个区间为重复判断这个为重叠区间)即保留什么区间——当然是左边没有元素的区间右边是否有元素可以不管。当左边有元素右边有元素那么这个区间就要删掉。
六:按照题意画分析图
- 画分析图时应罗列出所有情况
- 至少有三个点才能模拟出几乎所有的可能情况
- 注意起点情况,终点情况,中间点情况
七:模拟解答出答案的过程且题目应该包含各类题型
一个题目有示例,从示例中模拟出整个实现过程。
示例应该包含所有情况,应该模拟所有情况的示例。所有情况代表的是一个元素遇到的所有情况。然后用代码来模拟整个答案的实现过程即完成解题。
首先总结出所有情况的示例,然后一个个去模拟这个答案的实现过程。
例如:
力扣:968.监控二叉树
按照题目所给的情况是最基础的
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
我随意画了一种简单情况,如下:然后模拟出整个解答出答案的过程
此时3安装摄像头,1,2不确定。为什么3安装摄像头,为了实现更高的效率所以叶子节点的父节点首先安装摄像头。此时直到了要首先找到叶子节点,确定遍历顺序左右中。按此道理,1节点应该安装摄像头,因此以左右节点的状态来判断此节点应该如何做,我又画出了所有情况,于是有了第二张图。此时用代码来模拟整个答案的实现过程即完成解题。
八:是否可以通过前一个状态来求出当前状态即动态规划
九:解题从目的出发,思考达成这个目的的方法而不是跟随题意去产生方法
十:首先看题目属于什么类型是动态规划是贪心算法还是…,每个类型都有相应的解题方案
- 动态规划即当前值可由前面的值表示出来
- 贪心算法即…
- …
- …
- …
首先判断出题目的目的是什么,然后使用假设法,将每一个类型套用到题目上去,看哪一个能解出来,找到了之后每个类型都有相应的解题方案照做即可。
十一:每一点思考都写出来
十二:确定每个变量的含义