![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
T-tss玄
学习的孩子
展开
-
Leetcode Palindrome Pairs
Leetcode Palindrome Pairs,本算法的重点是通过hash表来保存映射。对于word,从正向推开始,我们记录其每一个substring,从反向我们也记录其每一个substring,并且保证除去substring后的剩于串是palindrome,这样对于查找时,可以知道,对于其它的word,如果其反转与substring相等,则知道他们加起来可以构成回文串,对于谁在前,谁在后,则根原创 2016-10-29 21:18:31 · 494 阅读 · 0 评论 -
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 · 405 阅读 · 0 评论 -
Leetcode Permutations II
Leetcode Permutations II,本算法使用回溯法完成,本算法的关键是对于重复元素的处理,对于同一位置,同一元素不能出现超过两次,否则会导致后续元素重复。本算法,首先对数组进行排序,排序后对元素出现次数进行统计,后续进行迭代时,使用这一统计数组,保证递归时不在同一元素不在同一位置出现两次。相关cpp代码与测试如下:#include<iostream>#include<vector>原创 2015-12-27 00:20:45 · 334 阅读 · 0 评论 -
Leetcode Largest Number
Leetcode Largest Number, 本题的主要内容是找出一个比较两数“大小”的方法,本算法提供一种递补归比较的方法,即把数拆从长度相等段(长的依赖短的拆分),这个不断的比下去,就会得到相应的“大小”关系。相关代码如下:#include<iostream>#include<vector>#include<string>#include<stack>#include<algorit原创 2016-01-27 00:49:28 · 383 阅读 · 0 评论 -
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 · 471 阅读 · 0 评论 -
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 · 648 阅读 · 0 评论 -
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 · 343 阅读 · 0 评论 -
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 · 402 阅读 · 0 评论 -
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 · 383 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 412 阅读 · 0 评论 -
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 · 372 阅读 · 0 评论 -
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 · 350 阅读 · 0 评论 -
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 · 449 阅读 · 0 评论 -
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 · 357 阅读 · 0 评论 -
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 · 345 阅读 · 0 评论 -
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 · 332 阅读 · 0 评论 -
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 · 399 阅读 · 0 评论 -
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 · 465 阅读 · 0 评论 -
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 · 689 阅读 · 0 评论 -
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 · 530 阅读 · 0 评论 -
Leetcode Increasing Triplet Subsequence
Leetcode Increasing Triplet Subsequence,本题主要的难点是如何使用o(n)的方法进行判别。 我们可以这样考虑,在扫描的时候提供一个下界(low)和上界(high),他们的初始值都不存在,并且在扫描时进行更新,更新方法如下:当设置上界后,如果找到大于上界的元素时,此时表示数组中存在满足条件的序列。当找到形式nums[i] > nums[i - 1]的元素时,原创 2016-04-24 18:02:52 · 1092 阅读 · 0 评论 -
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 · 383 阅读 · 0 评论 -
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 · 433 阅读 · 0 评论 -
Leetcode Regular Expression Matching
Leetcode Regular Expression Matching,本题的主要思路是回溯法,算法主要需要处理两种状态: 1. 正常字符时,如’a-z’, ‘.’等, 这类直接匹配。 2. 遇到”x*”形式时,需要使用回溯法,进行逐个测试,直接找到一个可用的子匹配,否非反回false。相关算法如下,以下算法效率不高,还有很多可优化的地方:#include<iostream>#include原创 2016-04-16 16:58:42 · 429 阅读 · 0 评论 -
Leetcode Self Crossing
Leetcode Self Crossing,本题的关键是找出区域的几种状态,以及一些边界情况。区域的状态有区域越来越大,在状态下我们只有保证有x[index] > x[index - 2]即可。区域越来越小,在此状态下,需要维护一个最大值与最小值,在一般情况大有x[index] < x[index - 2]即可,但是存在一些边界情况需要了解。边界状态有在index == 3时,进入越来越小原创 2016-04-15 19:51:53 · 329 阅读 · 0 评论 -
Leetcode Count of Range Sum
Leetcode Count of Range Sum ,本题如果用o(n^2)的方法,得出结果应该是相当简单的,但是有更优的算法。 本题的关键是使每次寻找满足条件的搜索代价最小,那就想到了搜索树了,如果使用平衡二叉搜索树,每次寻找的代价为o(log(n))。但是存在一个问题,如何在不遍历所有节点的情况下而保证节点的值在下次访问时是更新后的呢? 我们使用子树的树根记录整棵子树需要更新的值,并且在原创 2016-04-26 19:10:56 · 472 阅读 · 0 评论 -
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 · 454 阅读 · 0 评论 -
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 · 420 阅读 · 0 评论 -
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 · 365 阅读 · 0 评论 -
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 · 293 阅读 · 0 评论 -
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 · 296 阅读 · 0 评论 -
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 · 468 阅读 · 0 评论 -
Leetcode Game of Life
Leetcode Game of Life 相关代码,本题逻辑上相对简单,就是简单的迭代。但是题目要求使用in place完成,这样就得思考一下了,我的实现方案是,先行对数组进行扫描,每个位置对应的数字的高位记录邻居为“1”的个数,最低位记录当前的状态,这样可以保证得到了新的信息又不损失以前的信息,在所有位置扫描完后,只需根据邻居为“1”的个数和当前状态,直接更新下一个状态即可,相关代码以及测试如下原创 2015-10-27 00:54:25 · 489 阅读 · 0 评论 -
Leetcode Perfect Squares
Leetcode Perfect Squares 相关代码,使用dp算法完成,利用其最有子结构特性,算法复杂度为O(n ^ 3/2)。代码如下,以及相关测试:#include <iostream>#include <vector>using namespace std;class Solution {public: int numSquares(int n) { vec原创 2015-09-13 01:39:18 · 475 阅读 · 0 评论 -
Leetcode Maximum Product Subarray
Leetcode Maximun Product Subarray 相关算法实现,使用dp算法完成问题,并提供测试,提供两种实现,一种为常规的,别一种为最大子串积的快速解决方法,代码如下。常规解法:O(n^2)#include <iostream>#include <vector>using namespace std;class Solution {public: int maxPr原创 2015-09-12 08:56:05 · 483 阅读 · 0 评论 -
Leetcode Unique Binary Search Trees II
Leetcode Unique Binary Search Trees II代码,本代码使用c++完成,使用dp方法中的down-up方法,并提供对树的数量的测试。#include <iostream>#include <unordered_set>#include <vector>#include <string>using namespace std;// Definition for原创 2015-09-04 02:23:55 · 410 阅读 · 0 评论 -
Leetcode Minimum Path Sum
Leetcode Minimum Path Sum 相关代码,使用dp算法完成,使用down-up方法完成,并提供简单的测试。#include <iostream>#include <vector>using namespace std;class Solution {public: int minPathSum(vector<vector<int> >& grid) {原创 2015-09-09 00:54:54 · 340 阅读 · 0 评论 -
Leetcode Triangle
Leetcode Triangle 相关代码,使用dp方法完成,c++代码如下,并提供简单的测试代码。#include <iostream>#include <unordered_set>#include <vector>#include <string>using namespace std;class Solution {public: int minimumTotal(vec原创 2015-09-08 23:04:50 · 372 阅读 · 0 评论 -
Leetcode Unique Binary Search Trees
Leetcode Unique Binary Search Trees 代码,本代码使用down-up方法,并打印了相关信息,使用c++,如下:#include <iostream>#include <vector>using namespace std;class Solution {public: int numTrees(int n) { vector<int>原创 2015-09-01 23:26:43 · 446 阅读 · 0 评论