LeetCode OJ学习

  一直没有系统地学习过算法,不过算法确实是需要系统学习的。大二上学期,在导师的建议下开始学习数据结构,零零散散的一学期,有了链表、栈、队列、树、图等的概念。又看了下那几个经典的算法——贪心算法、分治算法、动态规划以及回溯算法。不过,都是知其一不知其二的一知半解。到最后,发现学到了一堆的一知半解,在学校课程开这门课时,却又是不得不再学一遍。学一样东西,又不全心全意地主动去把它学好,到最后只是花费了时间,却没真真学到东西。所以,不求学识有多广,但求所学的都精。

  一个偶然的机会,让我在网上找到了一本社区制作的LeetCode OJ的题解。看到这上面的题目,以及解法,真的是不得不叫好啊!这么巧妙的解决方法。今天看的题目都是数组问题的题目,且看题目:

  2.1.1 Remove Duplicates from Sorted Array

描述:

  Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

  Do not allocate extra space for another array, you must do this in place with constant memory.

  For example, Given input array A = [1, 1, 2],

  Your function should return length = 2, and A is now [1, 2].

  

 class Solution {
 public:
   int removeDuplicates(int A[], int n) {
     )
       ;  
     ;
     ; i < n; i++) {
       if (A[index] != A[i])
         A[++index] = A[i];
     }
     ;
   } 
 };

  2.1.2 Remove Duplicates from Sorted Array II

描述:

  Follow up for "Remove Duplicates": What if duplicates allowed at most twice?

  For example, Given sorted array A = [1, 1, 1, 2, 2, 3],

  Your function should return length = 5, and A is now [1, 1, 2, 2, 3].

  

 class Solution {
 public:
     int removeDuplicates(int A[], int n) {
         )
             return n;
         ;
         ; i < n; i++) {
             ])
                 A[index++] = A[i];
         }
         return index;
     }
 };

  很显然,这里所给的解决都是简单而有效的方案。特别是第二个例子,最多保留两个重复的数据。一开始我完全没想到,对于一个Sorted数组,如果A[index] equal A[index-2], 那么A[index]也equal to A[index-1]。也就是只需要确保头尾两个数相等,就能做到三个数相等。在这里,显而易见的是,好的解决方案是建立在对问题充分的研究和了解的基础上的,并充分利用数学性质。好的算法,往往都有一个好的数学模型。记得在解决第二个问题时,我不断的写,然后发现对于某一种情况不适合,然后再改,再验证,发现又对另一种新的情况补适合,不得不继续改。改到最终,终于可以满足我所能穷举的所有情况时,我发现代码已经臃肿不堪,连我自己读明白都得花点心思了。其实,指不定它还存在什么问题,不过我没有发现罢了。就像吴军博士所说的,Google早期的产品中,其实存在大量东拼西凑的山寨产品,它们老是这里出问题,那里出问题。一次次的修补,花费在修补维护上的成本最后也许会比开发设计的成本还高。而一个好的产品,一个好的算法,它是有坚实的理论基础支持,而不是东拼西凑的拼起来的。也唯有这样的算法,才能让我们感受到算法的美妙!

上一篇:java的重写规则


下一篇:LeetCode OJ 297. Serialize and Deserialize Binary Tree