03 2016 档案
摘要:利用最小堆思想。首先把1压入堆,然后取出堆顶元素,分别乘以2,3,5后把新增的数压入堆。然后再取堆顶元素操作。取第1000个丑数就是取第1000个不同的堆顶元素。 其实如果用set容器来做的话效率可能会提升,因为set不会把重复元素放进自身。set找最小的元素需要O(logN)的时间,表面上比堆的O
阅读全文
摘要:这道题目首先不管random指针,按照next指针把链表元素给复制出来。然后处理random指针,比较容易想到的想法是利用哈希思想(或者等价的map,set等stl容器),但这样的话需要辅助空间。 不需要辅助空间的方法,复制元素的时候把原始链表改成这样就可以了: 然后修改新增元素的random指针,
阅读全文
摘要:需要O(1)时间求出最小值。如果换成最大值,那就和“滑动窗口的最大值”一题思路差不多了。 用一个栈保存元素,用另一个栈来存储最小值,如果新增的元素比栈顶元素小则压入,否则不压入。 如果检测到第一个栈把最小元素弹出了,那么另一个栈也弹出栈顶元素。 “滑动窗口的最大值”更加复杂一点,而且是用deque保
阅读全文
摘要:调整后奇数相对位置不变,偶数相对位置不变。可以先找到第一个偶数所在位置和最后一个奇数所在位置,然后把偶数一次次向后移动,空出来的第一个位置用来填充最近的一个奇数,直到把最后一个奇数填充到空出来的位置为止。 1 class Solution { 2 public: 3 void reOrderArra
阅读全文
摘要:具体分析可见http://blog.csdn.net/libin1105/article/details/48267113 需要指出的是,上述博客中2*(a+b)=a+b+c+b应该改为2*(a+b)=a+b+(c+b)*n,其中n为自然数。 然后得到关系式a=(b+c)*n-b 由此可见两个指针会
阅读全文
摘要:1 class Solution { 2 public: 3 int LastRemaining_Solution(unsigned int n, unsigned int m) 4 { 5 if(n<1||m<1) 6 return -1; 7 int last=0; 8 for(int i=2;
阅读全文
摘要:先整体翻转一次,再一个个进行翻转,需要注意的是代码里一些字符串的操作,值得记住。 1 class Solution { 2 public: 3 string ReverseSentence(string str) { 4 if (str.empty()) return str; 5 reverse(
阅读全文
摘要:又是一道字符串题,一下子难有思路,所以往动态规划方向思考。 找到动归思路不难,主要是要考虑各种情况。首先将pattern进行处理,记下不含"*"的字符串npattern,同时用一个vector记录新字符串里有哪几个字符是可以任意个数的(这里我本来以为像b*b*这样的要简化为b,后来发现简化为bb就可
阅读全文
摘要:先判断有没有字符e或者E存在,如果有,则把字符分为两个字符串,分别判断这两个字符串是否能形成一个数字(注意e或E后不能有小数点,这个可以提前判断排除)。如果没有,那就直接判断这个字符串是否能形成一个数字。 1 class Solution { 2 public: 3 bool judge(char*
阅读全文
摘要:本质上是用BFS进行层序遍历,难点在于如何记录层的信息。 简单想法是可以用两个queue进行轮流操作。这里记录一种递归的做法。 1 class Solution { 2 public: 3 vector<vector<int> > levelOrder(TreeNode *root) { 4 vec
阅读全文
摘要:回文串判断,需要学习这段代码中transform,tolower,isalnum函数的使用。这种函数可以节省时间,比如判断是不是字母或者字符的函数isalnum。 另外就是要学着用auto类型。 回文串判断其实就是用头尾两个指针一个个判断过去,没什么好方法。当然还有衍生出来的题目,比如判断一个字符串
阅读全文
摘要:这道题一开始就没什么明确的正确想法,大致想着把树深度遍历,然后在遍历路径的上做文章,找到两条路径,这两条路径分别是树中部分结点相加之和第一大和第二大的路径。对这两条路径的头结点找最近公共祖先,然后看看这两条路径相连起来会不会是一个更大的和。找每条路径的基本思路来自求一个数组子数组的最大和题目。但最终
阅读全文
摘要:这道题有个小陷阱,就是代码中必须用(n%2==0)来判断而不能用(n%2==1)来判断。 因为n=-2147483648时,-n=-2147483648,如果用(n%2==1)来判断,在递归的时候会遇到某些负奇数,它们应该算是归类到(n%2==1)的那一类,但由于负奇数%2 1, 所以会造成不正确的
阅读全文
摘要:这种字符串题目,初看不好着手,八成又是动态规划题。用动态数组可以减少空间需求,这里没用。此外注意下第一行的初始化,和平常动归题略有不同。
阅读全文
摘要:可以设置一个变量记录能到达最右边的位置,如果该位置大于数组长度则返回true。否则每前进一步,更新下这个能到达最右边的位置变量。 或者可以用逆向思维,要达到最后一个,首先必须能达到前面位置中的某一个。这里采用逆向法。
阅读全文
摘要:一道字符串题,在没有想到用动态规划前感觉无从下手。注意动态规划的初始化操作。 1 class Solution { 2 public: 3 int minDistance(string word1, string word2) { 4 if(word1.size()==0||word2.size()
阅读全文
摘要:利用哈希表和滑动窗口来做题。一开始窗口内没有包含所有T的字符,扩大窗口直到包含T所有字符为止。然后再将窗口的左端向右移动,直到不能移动为止(再移动的话窗口内就没有所有T的字符了)。然后再移动窗口右端。如此循环。 1 class Solution { 2 public: 3 string minWin
阅读全文
摘要:链表题,需要额外两个结点来保存新链表的头结点和尾结点,同时前插一个结点到原始链表中会使操作简单。 class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if(head==NULL) return NULL; if(
阅读全文
摘要:有关链表的题目,很多都需要在编程前想好用多少个指针,比如链表反转的题目,就需要三个指针。这题需要额外四个指针,两个指针保存链表头,两个保存最后一个结点。 1 class Solution{ 2 public: 3 ListNode* partition(ListNode* head, int x)
阅读全文
摘要:这题要注意一种特殊情况,就是交换的两个数相邻时会怎么样。 此外,题目中要求用O(1)空间解题,那就只能递归中序遍历二叉树了,不能用栈。 1 class Solution { 2 TreeNode* p1; 3 TreeNode* p2; 4 stack<TreeNode*> is; 5 public
阅读全文
浙公网安备 33010602011771号