- 博客(74)
- 资源 (1)
- 收藏
- 关注
原创 Leetcode Palindrome Pairs
Leetcode Palindrome Pairs,本算法的重点是通过hash表来保存映射。对于word,从正向推开始,我们记录其每一个substring,从反向我们也记录其每一个substring,并且保证除去substring后的剩于串是palindrome,这样对于查找时,可以知道,对于其它的word,如果其反转与substring相等,则知道他们加起来可以构成回文串,对于谁在前,谁在后,则根
2016-10-29 21:18:31
497
原创 关于c++常量函数(const member function)
在c++ primer中对于常最函数的解析如下:By default, the type of this is a const pointer to nonconst version of the class type. However, in the case, we cannot bind this to a const object. And means we cannot call an
2016-10-29 20:30:24
2083
原创 Leetcode Recover Binary Search Tree
Leetcode Recover Binary Search Tree,本题的关键是“如何使用O(1)的空间遍历树”和“找出两个被swap的节点”。如何使用O(1)的空间遍历树这里主要需要使用一个数据节构Threaded binary tree,借助于Threaded binary tree可以很快的实现遍历。此外,使用in-order遍历搜索二叉树,正好是以升序遍历整个数据。找出两个被swap的节
2016-07-14 01:41:40
533
原创 Leetcode Candy
Leetcode Candy,本题主要在于发现元素间的关系,然后根据其,很快就可以找出O(n)的算法了。arr[i - 1] < arr[i + 1]这种情况下可以直接在arr[i - 1]的基础上加1得到arr[i]。arr[i - 1] = arr[i + 1],这种情况下直接让arr[i]为1即可。arr[i - 1] > arr[i + 1],这种情况需要细致考虑。首先可以设arr[i
2016-07-07 11:01:38
470
原创 Leetcode Best Time to Buy and Sell Stock IV
Leetcode Best Time to Buy and Sell Stock IV,本题主要是找出最大值与买卖次数的关系,很快可以求得结果。卖买次数与k的关系分析首先我们知道当次数不限时,只需要在所有上升部分的起点买入,然后在上升部分的终点卖出即可。当次数大于上升段数(设为max)时,与1相同。当k < max时,我们需要在这些部分中进行取舍。首先,我们可能会想到只去差值最大的k个段即可,
2016-07-06 18:32:55
466
原创 Leetcode Max Sum of Rectangle No Larger Than K
Leetcode Max Sum of Rectangle No Larger Than K。本题使用常规方法,需要O(m^2 * n^2)的时间复杂度,但是经过仔细的计设,可以使时间复杂度降低到O(smaller(n, n)^2 * larger(n, m) * log(larger(n, m))。相关步骤如下: 1. 设数组中较大的维度为dim_max, 较小的dim_min. 2. 针
2016-07-03 17:00:23
694
原创 Leetcode Count of Range Sum
Leetcode Count of Range Sum ,本题如果用o(n^2)的方法,得出结果应该是相当简单的,但是有更优的算法。 本题的关键是使每次寻找满足条件的搜索代价最小,那就想到了搜索树了,如果使用平衡二叉搜索树,每次寻找的代价为o(log(n))。但是存在一个问题,如何在不遍历所有节点的情况下而保证节点的值在下次访问时是更新后的呢? 我们使用子树的树根记录整棵子树需要更新的值,并且在
2016-04-26 19:10:56
478
原创 Leetcode Increasing Triplet Subsequence
Leetcode Increasing Triplet Subsequence,本题主要的难点是如何使用o(n)的方法进行判别。 我们可以这样考虑,在扫描的时候提供一个下界(low)和上界(high),他们的初始值都不存在,并且在扫描时进行更新,更新方法如下:当设置上界后,如果找到大于上界的元素时,此时表示数组中存在满足条件的序列。当找到形式nums[i] > nums[i - 1]的元素时,
2016-04-24 18:02:52
1102
原创 Leetcode Shortest Palindrome
Leetcode Shortest Palindrome,本算法主要在于如何加速匹配过程。如果使用常规的判断串s的最长前缀回文串,是不适合的,这样的算法复杂度达到了0(n^2)。如果我们从后,以及从前进行回文串匹配,可以加速,算法的相关步骤如下: 1. 按照kmp算法求于串s的kmpnext数组。 2. 当前匹配串位置为begin,从后向前的串匹配位置为end,以及后部截取位置为cur。 3.
2016-04-23 17:13:23
391
原创 Leetcode Edit Distance
Leetcode Edit Distance,本题可以使用两种法方来完成,不过可能效率有所不一样。动态规化使用record[word1.length + 1][word2.length + 1] 记录值。 如果要计算word1[index1…end1], word2[index2…end2]的值,可以分成以下四种情况: 1. 如果word1[index1] == word2[index2],最优
2016-04-16 19:20:17
439
原创 Leetcode Regular Expression Matching
Leetcode Regular Expression Matching,本题的主要思路是回溯法,算法主要需要处理两种状态: 1. 正常字符时,如’a-z’, ‘.’等, 这类直接匹配。 2. 遇到”x*”形式时,需要使用回溯法,进行逐个测试,直接找到一个可用的子匹配,否非反回false。相关算法如下,以下算法效率不高,还有很多可优化的地方:#include<iostream>#include
2016-04-16 16:58:42
436
原创 Leetcode Self Crossing
Leetcode Self Crossing,本题的关键是找出区域的几种状态,以及一些边界情况。区域的状态有区域越来越大,在状态下我们只有保证有x[index] > x[index - 2]即可。区域越来越小,在此状态下,需要维护一个最大值与最小值,在一般情况大有x[index] < x[index - 2]即可,但是存在一些边界情况需要了解。边界状态有在index == 3时,进入越来越小
2016-04-15 19:51:53
339
原创 Leetcode Merge k Sorted Lists
Leetcode Merge k Sorted Lists,这一个问题主要需要考虑的问题是:如何每次以最小的代价找出最小的值。我们可以使用一个最小堆来维护,设当前非空的链的个数为noEmpty,那么,每一次找出最小值的代码为:log(noEmpty)。 最坏的情况是,所有的链表都一样长,那么有此时的时间复杂度为:total * log(n)。其中total为总的node的个数,n为需要归并的链表
2016-04-09 20:07:10
461
原创 Leetcode Sudoku Solver My Submissions Question
Leetcode Sudoku Solver My Submissions Question ,本问题主要是使用递归的思想,不断的试探,直到得出结果,同时也得注意记录已有值的方法,主要是横向、纵向、以及每上九宫格。相关代码如下:#include<iostream>#include<vector>using namespace std;class Solution {public: v
2016-03-26 19:06:18
427
原创 Leetcode First Missing Positive
Leetcod First Missing Positive,本算法使用hash表实现,此外注意到positive从1开始,而给出的数组至有多len(arr)个positive,而且有如下几种情况:元素为负数,那么一定不会对计算positive产生影响元素为正数,但是元素大于len(arr),此时也不会对结果有影响,因为此时在1到len(arr)这些数中一定会有空出的元素,因此大于len(arr
2016-03-20 17:18:57
373
原创 Leetcode Insert Interval
Leetcod Insert Interval,记当前遍历的区间为cur,新区间为new本题主要是对几种情况的考虑,主要如有:cur.start > new.end,此时cur与new完全独立,可以直接push,但是new在cur前cur.start = new.end,此时cur与new可以连接起来,此时造一个新元素,并pushcur.start >= new.start and cur.e
2016-03-20 16:58:52
300
原创 Leetcode Largest Rectangle in Histogram
Leetcode Best Time to Buy and Sell Stack III,使用栈来解决本题,栈的元素有两个域,即:first(对应的值),second(对应的个数)。在使用栈时,我们考虑到三种情况,记当前要处理的元素为cur,注:以下算法,在弹出栈中元素时都计算面积(cur.first * cur.second),并与当前最大值比较,留下较大者。如果栈空,则直接push此元素入栈,
2016-03-20 02:00:22
304
原创 Leetcode Best Time to Buy and Sell Stock III
Leetcode Best Time to Buy and Sell Stock III,本算法的关键为找出其动态子结构。可以发现,序列中的最小值可以做为其的一个分割,令左边序列为left,右边的序列为right,整个串为whole,可以推出当前串的最大值一定是在:a.左序列一次transaction最大值(left_max)与右序列一次transaction最大值(right_max)之和,b.整
2016-03-16 19:43:58
339
原创 Leetcode Longest Consecutive Sequence
Leetcode Longest Consecutive Sequence,相算法主要依赖哈希表的快速查找功能,在使用unordered_set时,因为其内部使用hash表进行存储,因此查找速度相当快,因此算法复杂度可以炎o(n).#include<iostream>#include<vector>#include<iostream>#include<vector>#include<unor
2016-03-16 00:19:43
413
原创 Leetcode Minimum Height Trees
Leetcode Minimum Height Trees ,本问题的关键在于理解如何找出最小高度。只要找出图中的边界点之间的最大长度n,则可以知道树的最小高度应为:(n + 1) / 2。至于图中有几个最点,其在于n为奇数或者为偶数,若n为偶数,则只有一个最小点;若n为奇数,则有两个最小点。 相关代码以及测试如下:#include<iostream>#include<vector>#inc
2016-02-22 17:49:43
410
原创 Leetcode Largest Number
Leetcode Largest Number, 本题的主要内容是找出一个比较两数“大小”的方法,本算法提供一种递补归比较的方法,即把数拆从长度相等段(长的依赖短的拆分),这个不断的比下去,就会得到相应的“大小”关系。相关代码如下:#include<iostream>#include<vector>#include<string>#include<stack>#include<algorit
2016-01-27 00:49:28
390
原创 Leetcode Wiggle Sort II
Leetcode Wiggle Sort II,一种比较高效的解法,但是在一些情况下会出现为o(n^2)的时间复杂度。#include<iostream>#include<vector>#include<algorithm>using namespace std;class Solution {public: void wiggleSort(vector<int>& nums) {
2016-01-24 16:28:37
655
原创 Leetcode Permutations II
Leetcode Permutations II,本算法使用回溯法完成,本算法的关键是对于重复元素的处理,对于同一位置,同一元素不能出现超过两次,否则会导致后续元素重复。本算法,首先对数组进行排序,排序后对元素出现次数进行统计,后续进行迭代时,使用这一统计数组,保证递归时不在同一元素不在同一位置出现两次。相关cpp代码与测试如下:#include<iostream>#include<vector>
2015-12-27 00:20:45
341
原创 Leetcode Gray Code
Leetcode Gray Code,本题主要使用回溯法进行解决,通过一定的规则对二叉树进行遍历,并把值添加入结果集合中,就可以达到目的。要关代友与测试如下:#include<iostream>#include<vector>/** * We used the backtrack method to solve this problem. This problem can be * consi
2015-12-22 12:03:19
408
原创 Leetcode Range Sum Query 2D - Immutable
Leetcode Range Sum Query 2D - Immutable, 本题主要利用每个区域都可以用为0,0有原点的四个区域,通过加减而快速算出,相关算法如下:using namespace std;class NumMatrix {public: vector<vector<int > > recoder; NumMatrix(vector<vector<int> >
2015-12-15 11:30:57
391
原创 Leetcode Count Complete Tree Nodes
Leetcode Count Complete Tree Nodes,本算法主要可以使用二分搜索加速计算出最后一层最右边缺少的结点数,通过二分法,计算量变为O(h * h),其中h为树高,相对递归等方法的O(2^(h - 1))大大减少了计算量。相关算法如下:#include<iostream>#include<vector>#include<queue>/* * Get the number
2015-12-08 11:58:24
480
原创 Leetcode Longest Increasing Subsequence
Leetcode Longest Increasing Subsequence,本算法主要集中了动态归划和二分搜索,算法复杂度为o(n logn),相关代码如下:#include<iostream>#include<vector>/* There is some tricks in this algorithm. I am inspired by others. * The core philo
2015-12-05 10:45:45
352
原创 Leetcode Fraction to Recurring Decimal
Leetcode Fraction to Recurring Decimal,本题没有其它特别的,只是用map记录了相关位置的值、余数、以及位置,相关解题算法如下:#include<iostream>#include<string>#include<map>using namespace std;class Solution {public: string fractionToDec
2015-11-24 11:33:09
459
原创 Leetcode Multiply Strings
Leetcode Multiply Strings 相关代码,本处同时可以做为相加时的算法,相关代码如下: #include<iostream>#include<string>/* * We use the recursive algorithm to solve this proble. We can conclued that * the number with more digits c
2015-11-23 14:09:27
377
原创 Leetcode Number of Digit One
Leetcode Number of Digit One ,本算法主要使用递归的方法完成问题解决,相关代码及测试如下:#include<iostream>/* * We use the recursive algorithm to solve this proble. We can conclued that * the number with more digits can be constr
2015-11-23 11:17:23
455
原创 Leetcode Linked List Cycle II
Leetcode Linked List Cycle II ,本算法检测环的开始的点,基于Linked List Cycle 的结果,如果环存在,记录环长为cycleLength,并使用相隔cycleLength的两个游标进行遍历,则第一次两游标相等的时候,即为环的开始,相关代码如下:#include<iostream>#include<vector>using namespace std;st
2015-11-16 22:13:28
418
原创 Leetcode Linked List Cycle
Leetcode Linked List Cycle ,本算法主要检测单链表中的环,算法要求O(1)的空间。本算法通过以不同的步长进行检测,如果步长大于环长,则一定可以验测到环,算法时间复杂度O(n),相关代码如下:#include<iostream>#include<vector>using namespace std;struct ListNode { int val; Li
2015-11-16 22:05:00
357
原创 Leetcode Sort List
Leetcode Sort List ,本算法为进行链表排序,本题提供两种解法,其中解法一是符合题目要求的,如下:解法一:使用归并排序,使用O(nlg n)时间,O(1)空间,实现时,需要特别注意,我们是在链表上操作,因此除了操作部分,链表也不能与前后两部分断开,相关代码如下:#include<iostream>#include<vector>/* * There used the merge
2015-11-14 22:09:11
366
原创 Leetcode Word Pattern
Leetcode Word Pattern ,本算法关键在于使用map进行双向映射,相关cpp代码如下:#include<iostream>#include<vector>#include<map>#include<string>using namespace std;class solution {public: bool wordpattern(string pattern,
2015-11-08 00:58:39
411
原创 Leetcode Container With Most Water
Leetcode Container With Most Water ,本算法的主要原理是从前两个方向进行扫描,保存最大的,并且在缩减范围,依据丢弃较小值的原则,相关cpp代码与测试如下:#include<iostream>#include<vector>using namespace std;// First we calculate the front till the end as the
2015-10-29 13:34:33
355
原创 Leetcode Find Minimum in Rotated Sorted Array II
Leetcode Find Minimum in Rotated Sorted Array II 相关代码,本算法根据旋转后的数组的特性,对二分查找进行了相关改进,以下提供cpp代码,以及相关测试:#include<iostream>#include<vector>using namespace std;class Solution {public: int findMin(vect
2015-10-27 09:38:47
470
原创 Leetcode Game of Life
Leetcode Game of Life 相关代码,本题逻辑上相对简单,就是简单的迭代。但是题目要求使用in place完成,这样就得思考一下了,我的实现方案是,先行对数组进行扫描,每个位置对应的数字的高位记录邻居为“1”的个数,最低位记录当前的状态,这样可以保证得到了新的信息又不损失以前的信息,在所有位置扫描完后,只需根据邻居为“1”的个数和当前状态,直接更新下一个状态即可,相关代码以及测试如下
2015-10-27 00:54:25
496
原创 Leetcode Minimum Size Subarray Sum
Leetcode Minimum Size Subarray Sum ,本算法主要通过两个游标记录求和的范围,并不断移动end游标,如果和大于s,则移动begin游标,从而缩紧约束,同时不断记录当前求和范围长度,相关cpp代码以及测试如下:#include<iostream>#include<vector>#include<climits>// The basic method fo this
2015-10-24 10:15:25
450
原创 Leetcode Next Permutation
Leetcode Next Permutation ,通过查看排列的特性,可以发现,每一次改变值的位置之后的元素都是按升序排列的,如:arr = [5, 4, 2, 3, 1],可以知道其下一个排列为:brr = [5, 4, 3, 1, 2],对于arr可以发现元素“2”后面元素为降序排列,那么如果要生成下一个序列,就应该在2之后找出一个大于2的元素代替“2”,可以找到的是3。这样,在“3”出现在
2015-10-23 12:11:51
430
原创 Leetcode Rotate Image
Leetcode Rotate Image 解决方法,本方法通过把一个矩阵分割成不同的环,然后对很一个环进行旋转,从而解决旋转问题,相关cpp代码,以及测试如下:#include<iostream>#include<vector>using namespace std;// In order to rotate the matrix in place, we make each cycle as
2015-10-23 08:26:58
427
简单本地DNS服务器实现代码(C++)
2015-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人