leetcode第238场周赛,为这一星期的leetcode刷题收尾<数组一>

       这一专栏的博客与我原来写的leetcode刷题专栏不同,用文字记录我这一星期的算法学习以及一些心得体会。之后的每个星期我都会写一篇类似的博客。
       在过去的一个星期里,我写了十五道数组专栏的题目。以前的我图个题量,每天近十道题,坚持了两个月,刷了五百多道题。刷了那么多题之后,我发现我的算法能力并没有提升多少,回顾我的刷题历程,为了赶进度,我几乎没有花多少时间去思考,更多的时候,我是拿到一个题想了没多久就去看题解,然后似懂非懂的“写”。看着过去两个月的忙碌和已经刷的题目数量,给了我一种错觉。现在我打算从头再写一遍,不贪图刷题数量,只是想好好的思考分析每一道题目。最近的一个星期,虽然写的题不多,但每题都是自己思考分析写出来的,当彻底搞懂了一个知识点时,还是很有成就感的。接下来我会总结这个星期的学习体会。

  1. 首先我想谈谈二分法,它给我的感触最大,只有自己写了才明白,原来我根本不会写二分的代码。一个是while条件,一个是right,left的变化规律。大部分情况下是while(left<=right);if…right=mid-1;else…left=mid+1。如果没有亲手写过二分,是不会注意到这些细节的。就像我第一天用二分一样,那是一个很简单的题目,只需要用二分法实现就行,但我愣是没写出来,不是不知道原理而是上述所说的三个点没有搞明白,最后的结果也会相差很大。一个二分的简单题,我写了一个多小时,好在最后是彻底弄懂了。现在我刷题是不会看题解了,直到自己写出来,时间多花一些都无关紧要,因为我要的就是这个思考过程,而不是最后的答案。也就是这样一种学习态度,我在第238场周赛中用到了二分,并成功解决了原代码超时问题。如果目标序列有序(即使无序也可以转换成有序),只要你要做的工作需要遍历完整个序列才能得到,那么一定能用二分来优化。可是,如果二分都不熟练的话,又怎么会想到优化呢,即使想到了,因为某个点没搞透,卡了很久时间,那也得不偿失。
  2. 当我们用一些数据结构的内置方法时,应该考虑一下是否会运行超时,能不能用其它的方法代替,有时是只需要在代码中加一个判断条件,就可以避免使用数据结构内置方法的。比如说,如果按照你的思路编写代码,下个步骤是去重,会不会想到set,map等数据结构。通常反应都会有,个人觉得可以多思考一会儿,想想还有没有其它方法,不要直接使用。
  3. 有些时候,解决一个问题时需要考虑很多种情况,如果直接硬刚的话会使代码变得很复杂,而且最后也不一定能做的出来。比如说,如果题目传入的一组序列,调换序列中的元素对结果无影响时,可以考虑先排序的方式来使题目简化,有些情况在排序好的序列中就不存在了,题目也会容易许多。总而言之,如果调换序列中的元素不影响结果的话,可以考虑做适当的变换再来求解。50乘50比100乘1收益要大得多。
  4. 当我们使用List等集合时并且List的长度随着代码运行不断变长,List的长度不要放在for循环内,要用一个临时变量tempsize来代替,否则for循环会一直循环下去。
  5. 不是所有优化都叫O(nlogn),还有中优化叫O(n+m),所以不要惯有思维的觉得超时了就得用二分什么的,O(n+m)一样很厉害。
  6. 这次周赛,四题写对了三道,第一次尝试,感觉还行,以后继续。

你可能感兴趣的:(Leedcode周赛心得,数据结构,算法,java,leetcode)