
LeetCode
NK_ZZL
这个作者很懒,什么都没留下…
展开
-
Leetcode109.Convert_Sorted_List_To_Binary_Search_Tree
在Leetcode看别人的代码,有用快慢指针寻找中点,在二分递归的。但个人觉得既然无论如何都是O(N)的时间复杂度了,不如将链表转换成数组解决方便。思路同Leetcode108.Convert_Sorted_Array_To_Binary_Search_Tree时间复杂度:O(N)C++代码:class Solution {public: TreeNode * sortedListToB...原创 2018-11-28 15:24:40 · 282 阅读 · 0 评论 -
Leetcode75.Sort_Colors
显然对数组进行一次遍历记录0,1,2的个数,后再次从首至尾重写数组,可以在两次遍历完成任务。更好的解决办法是利用Leetcode26.Remove_Duplicates_From_Sorted_Aarray的思路,前后各设置一个标志点,然后遍历数组,遇到0则向前边的标记点交换,标记点后移;遇到2则向后边的标记点交换,标记点前移。注意交换完需要检查一下交换过来的数是不是0或2,若是则需要再次交换。...原创 2018-10-10 13:19:10 · 113 阅读 · 0 评论 -
Leetcode20.Valid_Parentheses
运用栈,若栈为空,则只要压入闭括号即为false。遇到开括号则压入;遇到闭括号则判断与栈顶的开括号是否匹配,若匹配则二者配对弹出,否则return false。结束后检查栈内是否仍有元素,若有则return false;反之,return true。时间复杂度:O(N)C++代码:class Solution {public: bool isValid(string s) { sta...原创 2018-10-10 13:26:13 · 142 阅读 · 0 评论 -
Leetcode86.Partition_List
时间复杂度:O(N)C++代码:class Solution{public: ListNode * partition(ListNode* head, int x) { if (head == nullptr || head->next == nullptr) return head; ListNode n(INT_MIN); n.next = head; he...原创 2018-10-20 10:01:41 · 93 阅读 · 0 评论 -
Leetcode96.Unique_Binary_Search_Trees
对于有n个节点的二叉树,由于根节点是固定的,所以n个节点的组合是(n-1)个节点组成的两个子树所有可能性乘积的和即,h(n)=∑i=0n−1h(i)∗h(n−1−i)h(n)=\sum_{i=0}^{n-1}{h(i)*h(n-1-i)}h(n)=i=0∑n−1h(i)∗h(n−1−i)这个递推公式即为卡塔兰数的定义式,其通项公式为:h(n)=1n+1C2nnh(n)=\frac{1}{n+...原创 2018-10-22 22:07:15 · 137 阅读 · 0 评论 -
Leetcode90.Subsets_II
与Leetcode78.Subsets的思路完全相同,去重方法:将nums排序,当在某一次循环内遇到相同的数,则跳过。时间复杂度:C++代码:class Solution {public: vector<vector<int>> result; vector<vector<int>> subsetsWithDu原创 2018-10-20 10:14:55 · 174 阅读 · 0 评论 -
Leetcode95.Unique_Binary_Search_Trees_II
由Leetcode96.Unique_Binary_Search_Trees中的递推公式,我们可知,生成一棵n个节点的二叉搜索树需要固定一个根节点,然后用剩余(n-1)个节点组合左右子树,组合所有可能性。由此,我们可以递归的解决这个问题。时间复杂度:O(4nn)O(\frac{4^n}{\sqrt{n}})O(n4n)C++代码:class Solution {public: ve...原创 2018-10-25 13:50:52 · 128 阅读 · 0 评论 -
Leetcode81.Search_In_Rotated_Sorted_Array_II
思路类似于Leetcode33.Search_In_Rotated_Sorted_Array,区别在于对重复的处理。当中间数字与首/尾数字相同时,我们无法确定哪边是有序的(1111231和1231111)。当首/尾重复时则将首/尾向后/前移一位直到不重复为止。时间复杂度:O(N)(当数组全部为重复的数字时,出现此最坏上界)C++代码:class Solution {public: boo...原创 2018-10-16 13:14:12 · 149 阅读 · 0 评论 -
Leetcode78.Subsets
这里复用了Leetcode77.Combination中的组合函数,寻找有限集的子集就是列出从0-n的所有组合时间复杂度:O(NeN)O(Ne^N)O(NeN)(此界随N增大而渐进)时间复杂度分析:对大小为k的子集,有CnkC^k_nCnk个,每个需要k步向数组内添加数字的操作于是我们可以得出总操作数为:F(n)=∑k=0nkCnk,又因为Cnn−k=Cnk,有F(n)=∑k=0[n2...原创 2018-10-09 13:33:46 · 172 阅读 · 0 评论 -
Leetcode67.Add_binary
注意进位时间复杂度:O(N)(N = max{a.length(),b.length()})C++代码:class Solution {public: string addBinary(string a, string b) { if (a.length() >= b.length()) { a.insert(a.begin(), '0'); auto it_b...原创 2018-09-28 22:35:52 · 99 阅读 · 0 评论 -
Leetcode74.Search_A_2D_Matrix
两次二分查找时间复杂度:O(logN+logM)C++代码:class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.empty()) return false; if (matrix[0].empty())...原创 2018-10-07 22:15:33 · 139 阅读 · 0 评论 -
Leetcode73.Set_Zatrix_Zeroes
对于一个M*N的矩阵,可以很简单的想到,用一个大为M的数组标志某行是否有零,用一个大为N的数组标志某列是否有零进而,我们用矩阵内的第一行和第一列作为标志数组。当某行第一列有零,flag=true标志第一列有零(该算法会破坏第一列/第一行信息,需要记录其中之一是否有零),该行某列为零,则该行第一列为零,该列第一行为零。最后把第一行/列为零的列/行,全部置零,若flag=true则第一列全部置零。...原创 2018-10-07 22:26:52 · 160 阅读 · 0 评论 -
Leetcode61.Rotate_List
对于大小为n的链表,旋转k次,若k>n则等价为旋转k%n次。旋转k次(假设k<n)可以看成将链表首尾相连,再在第(n-k-1)个和第(n-k)个中间断开形成的新链表。时间复杂度:O(N)C++代码:class Solution {public: ListNode * rotateRight(ListNode* head, int k) { if (head == null...原创 2018-09-29 17:07:15 · 104 阅读 · 0 评论 -
Leetcode62.Unique_Paths
一开始以为是DFS,代码超时后,发现没认真审题。只能向下和向右移动。运用我在Leetcode70.Climbing_Stairs中分析的重复数全排列,对于m*n的区域,需要(m-1)次向右和(n-1)次向下,不同到达终点的方法有Am+n−2m+n−2Am−1m−1∗An−1n−1\frac{A_{m+n-2}^{m+n-2}}{A_{m-1}^{m-1}*A_{n-1}^{n-1}}Am−1m−1...原创 2018-09-29 17:18:54 · 105 阅读 · 0 评论 -
Leetcode77.Combination
为了防止重复,列举组合可能时,我们从大到小列举数字(亦可从小到大)。对n个数选取k个,可以转化为选取在[k,n]每一个i,再小于i的(i-1)个数选取(k-1)个。如此,递归的求解。时间复杂度:O(2nn)O(2^n\sqrt{n})O(2nn)C++代码:class Solution {public: vector<vector<int>> result;...原创 2018-10-08 19:08:24 · 173 阅读 · 0 评论 -
Leetcode28.Implement_Strstr
时间复杂度:O(N)C++代码:class Solution {public: int strStr(string haystack, string needle) { if (needle.empty()) return 0; auto it_h = haystack.begin(), it_h2 = it_h, it_n = needle.begin(); while...原创 2018-10-08 19:22:42 · 118 阅读 · 0 评论 -
Leetcode100.Same_Tree
对二叉树的先序遍历,有不同则return false时间复杂度:O(N)C++代码:class Solution {public: bool isSameTree(TreeNode* p, TreeNode* q) { if (p == nullptr && q == nullptr) return true; else if (p == nullptr |...原创 2018-10-09 12:43:31 · 127 阅读 · 0 评论 -
Leetcode93.Restore_Ip_Addresses
IP地址格式:X.X.X.X(0&amp;amp;amp;lt;=X&amp;amp;amp;lt;=255),例如172.10.255.0主要需注意的几个点:对‘0’的处理,不能出现001,010等0为首位的情况(但0可以单独存在(X.0.X.X是合法的));注意三位数的大小不能超过255,超过即为非法。时间复杂度:O(N)C++代码:class Solution {public: vector&amp;amp;amp;lt;stri原创 2018-10-25 20:07:03 · 138 阅读 · 0 评论 -
Leetcode36.Valid_Sudoku
三个数组分别储存某行某列某33方阵的数字出现情况,有重复则无效。时间复杂度O©(C=99)C++代码:class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { const int len = 9; int row[len][len]{ 0 }, col[len...原创 2018-10-25 20:26:07 · 86 阅读 · 0 评论 -
Leetcode79.Word_Search
回溯法时间复杂度O(NMK)(在长N宽M的矩阵内搜索长为K的单词)C++代码:class Solution { vector<vector<char>> a; vector<vector<bool>> use; int n; int m;public: const int wx[4] = { 0,0,-1,1 }; const i...原创 2018-11-04 14:53:22 · 292 阅读 · 0 评论 -
Leetcode106.Construct_Binary_Tree_From_Postorder_And_Inorder_Traversal
此题与Leetcode105.Construct_Binary_Tree_From_Preorder_And_Inorder_Traversal的思路基本相同。唯一的不同是后序遍历得到的数组顺序是左—右—根,从后向前(或反转后从前向后)先找到的根的右子树,而105题中先找到的是左子树。时间复杂度:O(N)C++代码:class Solution {public: TreeNode *...原创 2018-11-07 15:05:34 · 191 阅读 · 0 评论 -
Leetcode102.Binary_Tree_Level_Order_Traversal
用队列对二叉树进行层次遍历,因为需要把不同层的元素储存在不同的数组里,所以要额外保存数据在哪一层上。不要用整型数据判断数据读取到哪层上(本人开始时用第n层有2n2^n2n个节点(储存目前加进数组的个数和因上面若干节点为空导致本层节点缺失的个数)判断目前数据在哪层),这种储存方式虽然空间占用少,但当n过大时数据会溢出(有一测试用例有600层)。class Solution {public: ...原创 2018-11-07 16:01:14 · 137 阅读 · 0 评论 -
L101.Symmetric_Tree
将二叉树对称遍历,这里给出递归和迭代两种方法时间复杂度:O(N)C++代码://迭代class Solution {public: bool isSymmetric(TreeNode* root) { if (root == nullptr) return true; queue<TreeNode*> record; record.push(root-&g...原创 2018-11-19 19:54:30 · 164 阅读 · 0 评论 -
104.Maximum_Depth_Of_Binary_Tree
二叉树最简单的性质之一,递归可得。时间复杂度:O(N)C++代码:class Solution {public: int maxDepth(TreeNode* root) { if (root == nullptr) return 0; return max(maxDepth(root->left), maxDepth(root->right)) + 1; }...原创 2018-11-19 20:05:26 · 145 阅读 · 0 评论 -
Leetcode103.Binary_Tree_Zigzag_Level_Order_Traversal
用一个栈来使数据反向。时间复杂度:O(N)C++代码:class Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { if (root == nullptr) return {}; int dir = 1; vector<vector<int...原创 2018-11-19 22:22:31 · 165 阅读 · 0 评论 -
Leetcode107.Binary_Tree_Level_Order_Traversal_II
层序遍历再反转结果时间复杂度:O(N)C++代码:class Solution {public: vector<vector<int>> levelOrderBottom(TreeNode* root) { if (root == nullptr) return {}; queue<pair<TreeNode*, int>> ...原创 2018-11-20 12:20:24 · 158 阅读 · 0 评论 -
Leetcode108.Convert_Sorted_Array_To_Binary_Search_Tree
将有序数组当做一个二叉搜索树的中序遍历,每次从中间分开,以保证子树平衡,递归的写出算法。时间复杂度:O(N)C++代码:class Solution {public: TreeNode* sortedArrayToBST(vector<int>& nums) { if (nums.empty()) return nullptr; int mid = nu...原创 2018-11-28 15:11:46 · 254 阅读 · 0 评论 -
Leetcode110.Balanced_Binary_Tree
height函数用于计算结点高度,当左右儿子高度差大于1,则停止计算返回-10。时间复杂度:O(N)C++代码:class Solution {public: bool isBalanced(TreeNode* root) { if (root == nullptr) return true; return height(root) + 10; } int height...原创 2018-11-01 16:16:25 · 229 阅读 · 0 评论 -
Leetcode105.Construct_Binary_Tree_From_Preorder_And_Inorder_Traversal
前序数组的结构为:根—左子树所有结点—右子树所有结点中序数组的结构为:左子树所有结点—根—右子树所有结点确定根在中序数组的位置即可确定左右子树的大小,从而从前序数组找到左儿子结点和右儿子结点的值。之后,分别以左儿子和右儿子结点为根,进行相同操作。时间复杂度:O(N^2)(最坏的情况为所有节点均为左子树,每次find操作都要遍历未放进二叉树的所有值,总操作数为n(n+1)2\frac{n(n+...原创 2018-11-01 15:39:26 · 156 阅读 · 0 评论 -
Leetcode82.Remove_Duplicates_From_Sorted_List_II
时间复杂度:O(N)C++代码:class Solution {public: ListNode * deleteDuplicates(ListNode* head) { if (head == nullptr) return head; ListNode* dummy = new ListNode(-1); dummy->next = head; int va...原创 2018-10-21 12:38:15 · 158 阅读 · 0 评论 -
Leetcode92.Reverse_Linked_List_II
以1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5(m=2,n=4)为例时间复杂度:O(N)C++代码:class Solution {public: ListNode * reverseBetween(ListNode* head, int m, int n) { if (head == nullptr || head-&amp;gt;next == nu原创 2018-10-21 15:56:58 · 106 阅读 · 0 评论 -
Leetcode206.Reverse_Linked_List
思路见Leetcode92.Reverse_Linked_List_II时间复杂度:O(N)C++代码:class Solution {public: ListNode * reverseList(ListNode* head) { if (head == nullptr || head->next == nullptr) return head; if (head-...原创 2018-10-21 16:15:13 · 111 阅读 · 0 评论 -
Leetcode94.Binary_Tree_Inorder_Traversal
二叉树的中序遍历的递归解法是显然的,这里只列出非递归算法。优先对左儿子向下搜索,搜索到尽头则将其值保存,再尝试向右搜索。时间复杂度:O(N)(N为节点数)C++代码:class Solution {public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack...原创 2018-10-21 21:46:31 · 98 阅读 · 0 评论 -
Leetcode91.Decode
利用动态规划的思路,到某点的可能组合数是这点向前一位的点的组合加上这个点向前两位的点的组合(如果前两位在[1,26]的范围内),其中,F(1) = 1。时间复杂度:O(N)C++代码:class Solution {public: int numDecodings(string s) { if (s.empty()) return 0; vector&amp;lt;int&amp;gt; ...原创 2018-10-21 21:51:32 · 111 阅读 · 0 评论 -
Leetcode98.Validate_Binary_Search_Tree
对于二叉搜索树的任意一个节点,其值应满足:向上回溯,第一个向左的节点,是其下界;第一个向右的结点,是其上界。例如:从‘14’向上回溯,第一个向左的结点是‘13’,第一个向右的结点是‘14’,所以‘14’的位置正确。那么,我们反过来,从上向下看,就有:左儿子的父节点决定其后所有结点的上界,右儿子的父节点决定其后所有结点的下界。时间复杂度:O(N)C++代码:class Solution...原创 2018-10-29 10:59:53 · 134 阅读 · 0 评论 -
Leetcode141.Linked_List_Cycle
分析见判断链表是否成环及环周长与未成环长度计算时间复杂度:O(N)C++代码:class Solution {public: bool hasCycle(ListNode *head) { if (head == nullptr) return false; ListNode* fast = head, *slow = head; while (fast != null...原创 2018-10-29 11:09:48 · 142 阅读 · 0 评论 -
Leetcode144.Binary_Tree_Preorder_Traversal
前序遍历的递归写法是显然的,这里只给出非递归的解法(用栈实现)。时间复杂度:O(N)C++代码:class Solution {public: vector<int> preorderTraversal(TreeNode* root) { if (root == nullptr) return {}; vector<int> result; st...原创 2018-10-29 12:32:16 · 171 阅读 · 0 评论 -
Leetcode48.Rotate_Image
对N*N矩阵的旋转可以看成对若干坐标的旋转变换,以matrix[0][0]位置为原点向下、向右做坐标系,使matrix[y][x]落在网格的(x,y)坐标上。对每个点以((N-1)/2,(N-1)/2)为旋转中心,顺时针旋转90°。在(x,y)上的点旋转完应落在(n-y,x)上。连续旋转4次会回到原点,我们对这样的每一组4个数进行数字的顺时针交换,然后使x加1,直到该行所有点均交换完数字,进入内...原创 2018-09-28 22:06:13 · 218 阅读 · 0 评论 -
Leetcode22.Generate_Parentheses
回溯法时间复杂度:O(4nn32\frac{4^n}{n^{\frac{3}{2}}}n234n)(时间复杂度分析见“卡塔兰数”)C++代码:class Solution {public: vector&amp;lt;string&amp;gt; result; vector&amp;lt;string&amp;gt; generateParenthesis(int n) { generate(&原创 2018-10-06 22:22:29 · 139 阅读 · 0 评论 -
Leetcode58.Length_Of_Last_Word
从后向前寻找,跳过尾部的空格。也可用STL中,find_last_not_of()与rfind()完成对第一个非空格字符与字符后第一个空格的寻找。时间复杂度:O(N)C++代码:class Solution {public: int lengthOfLastWord(string s) { if (s.empty()) return 0; auto it = s.rbeg...原创 2018-09-18 16:17:37 · 108 阅读 · 0 评论