LeetCode总结之一

最近在陆陆续续的练习LeetCode,将自己以前的只是总综合巩固一下,也为了以后面试准备。尽量从自己的所思所想出发,鄙人菜鸟,还请勿喷。整个练习过程中采用C++。
1、我练习主要遵从一下几个习惯:from easy to hard . similar problems . Tags.
2、由于是第一次练习OJ,很多东西都不熟,所以多参考了别人的思路,然后自己再实现以便,有人说尽量自己思考,我觉得每个人都有自己的方法吧,一开始学习时,什么都自己去思考是一件很痛苦的事情,不过我有个原则:遇到事情首先要想,它考什么,该如何做,要注意什么,有没有类似的;有些觉得就是有一两点想不到的,就参考别人的,反正后面我还会再练一遍的;几遍读下来,一点都没感的,就直接pass,可能今天天气不太好吧。
3、记录一些自己当时的想法,古语有云,好记性不如烂笔头。每次看到别人写的一大堆的技术性文章都好崇拜,好激动,我比较懒,很少写,当然也只是为了记录记录学习过程了,顺便整理一下资料。

下面正式开始:
关于LeetCode是什么我就不介绍了,请自行百度或脑补。
LeetCode中主要分为这几大类:Array、Hash Table、Linked List、Math、Two Pointers、Divide and Conquer、String、Binary Search、Dynamic Programming、Backtracking、Stack、Heap、Greedy、Bit Manipulation、Tree、Sort、BFS、DFS、Union Find、Graph、Design、Recursion、Trie、Binary Indexed Tree、Brainteaser、Memoization、Topological Sort等。有的题目是这几个点的综合,有的可以有多种解题思路。
接下来sunny将依次为你解读这些tag。
Array
c++中的array主要用vector来实现,具有长度可变,可整体拷贝等优点。在进行练习之前,请先熟悉一下基本的操作。
其中有一个题目要array rotate。例如给定数组[1 2 3 4 5 6 7],进过k(3) step后为[5 6 7 1 2 3 4],这个题目主要就是要找出rotate的数学关系即原先下标为i的元素,经过变化后所在的序号应该为:(i+k)%n。这类题目找个例子来试一试就知道了,类似的还有single list rotate 。重要的点就是将其先变为循环链表。找出数学关系在dynamic programming中也应用的较多。
另外一个容易和array结合的就是two pointer了,由于array经常需要做的就是元素之间的移动了,删除呀、合并呀、移动呀,这些都需要用到。典型的有如remove element、move zeros、remove duplicate from sorted array.这类只要想到了都比较简单。
接下来就是借助数学知识,用array去实现的比如 Pascal’s Triangle,有点像动态规划,用iterator or recursive求解最重要的还是找到前后之间的关系规律,对于一些空间、时间有特殊要求的,就要精心安排,多练习,多总结了。后面有时间会一一点出。
最后,我想点一下和Hash Table的结合,其中用的最多的映射即是元素和出现次数之间的映射element<–>count 。有如 single number , contains duplicate。常用的一种思想是元素做键,元素的下标做值。
好了,下次就开始list的介绍了。

你可能感兴趣的:(LeetCode总结之一)