刷题笔记
文章平均质量分 57
zibingling777
这个作者很懒,什么都没留下…
展开
-
54. Spiral Matrix
1. DescriptionGiven a matrix of m*n elements, return all elements of the matrix in spiral order.2. SolutionJust do it. In any loop, print the elements from left to right, top to down, right原创 2017-12-20 09:55:10 · 93 阅读 · 0 评论 -
59. Spiral Matrix II
1、题目描述输入数字n,返回旋转着填入n*n矩阵的矩阵。2、思路模拟3、代码 vector> generateMatrix(int n) { vector > ans(n,vector(n,0)); int k=1,count = n*n; int t=0,b=n-1,l=0,r=n-1; w原创 2017-12-20 10:16:30 · 83 阅读 · 0 评论 -
57. Insert Interval
1、题目描述给出一个无重叠的区间的集合和一个要插入的区间newi,将它插入集合中,返回新集合。2、思路分几种情况:1、无重叠情况插在最头上、最尾上、插在中间一个位置。2、有重叠情况把重叠的集合都合并以后再插入。3、代码 vector insert(vector& intervals, Interval newi) { vec原创 2017-12-20 10:25:43 · 117 阅读 · 0 评论 -
58. Length of Last Word
1、题目描述给一个含有空格的字符串,返回最后一个单词的长度。2、思路不解释。3、代码 int lengthOfLastWord(string s) { int n=s.size(); int ans=0; int i = n-1; while(i>=0&&s[i]==' ')原创 2017-12-20 10:31:41 · 120 阅读 · 0 评论 -
61. Rotate List
1、题目描述给一个单链表和整数k,旋转链表k位,返回新链表。2、思路也就是说,把链表的倒数k位,全都移动到链表头上来,k可能会大于链表长度,所以实际移动步数是k%len。Two Pointers。一个指针f先走k步,之后指针p和f一起走,直到f走到最后一个节点。此时p的位置是新链表的尾元素位置。让f->next等于head,让 答案指向p->next,让p-原创 2017-12-20 10:38:24 · 134 阅读 · 0 评论 -
189. Rotate Array
1、题目描述给一个数组和一个整数k,旋转数组k部,返回新数组。2、思路实际上旋转k%len步。3、代码 void rotate(vector& nums, int k) { int n = nums.size(); k=k%n; for(int i=0;i<k;i++){ int t原创 2017-12-20 10:45:39 · 87 阅读 · 0 评论 -
83. Remove Duplicates from Sorted List
1、题目描述给一个有序的单链表,删除所有重复元素,是每个元素只出现一次。2、思路跳过和上一个节点元素相同的节点,从而连接产生新链表。3、代码 ListNode* deleteDuplicates(ListNode* head) { if(head==NULL||head->next==NULL) return hea原创 2017-12-20 10:51:49 · 93 阅读 · 0 评论 -
97. Interleaving String
1、题目描述输入字符串s1,s2,s3,判断s3是否可以由s1与s2交织而成。2、思路dynamic programming。dp[i][j]指的是s1的前i位和s2的前j位组成的字符串能否形成s3的前i+j位。3、代码 bool isInterleave(string s1, string s2, string s3) { int l原创 2017-12-20 11:07:08 · 85 阅读 · 0 评论 -
96. Unique Binary Search Trees
1、题目描述输入n,n个节点能形成多少种不同的BST。2、思路0个节点形成0个,1.。。。1,2.。。。2;3个节点,则必有一个节点当根节点,1当根节点,右子树由2个节点组成;2当根节点,左右两个子树都由1个节点组成;3当根节点,左子树由两个节点组成。重复这种计算操作,直至算出n个节点。3、代码 int numTrees(int n) {原创 2017-12-20 11:12:24 · 81 阅读 · 0 评论 -
95. Unique Binary Search Trees II
1、题目描述输入n,返回所有由节点值为1~n的n个节点形成的BST。2、思路递归。每个节点都去当一下根节点,再算出左右子树的所有可能性。进行结合。3、代码 vector generateTrees(int n){ vector ans; if(n==0) return ans; return generate原创 2017-12-20 11:24:13 · 80 阅读 · 0 评论 -
145. Binary Tree Postorder Traversal
1、题目描述二叉树的后序遍历。2、思路后序遍历顺序为左右中。反过来也就是中右左。可以借助先序遍历的思想,先中右左遍历,再把答案逆序。3、代码 vector postorderTraversal(TreeNode* root) { vector ans; if(root==NULL) return ans; s原创 2017-12-20 11:48:14 · 101 阅读 · 0 评论 -
22. Generate Parentheses
1、题目描述输入整数n,返回由n对()组成的合法的括号排列。2、思路Backtracking。Implement an function called dfs.One argument passes to this function is a string named s, which is "(".Another argument named cnt, which原创 2017-12-18 18:52:00 · 99 阅读 · 0 评论 -
64. Minimum Path Sum
1、题目描述给一个m*n的格子,从左上走到右下,路径上的和最大。2、思路动态规划。3、代码 int minPathSum(vector>& o) { int n=o.size(); if(n==0) return 0; int m=o[0].size(); int dp[n]原创 2017-12-18 20:28:36 · 76 阅读 · 0 评论 -
230. Kth Smallest Element in a BST
1、题目描述返回一个BST里从小到大的第k个元素。2、思路中序遍历。找到第k个元素。3、代码 int kthSmallest(TreeNode* root, int k) { vectorv; stacks; while(root){ s.push(root);原创 2017-12-20 11:51:18 · 98 阅读 · 0 评论 -
70. Climbing Stairs
1、题目描述输入n,要走上n层楼梯,每次可以爬1阶或者2阶,共有多少种爬楼方法 。2、思路dp[i] = dp[i-1] + dp[i-2]可以dp,从状态转移方程也可以知道是斐波那契数列。3、代码 int climbStairs(int n) { if(n<2) return 1;原创 2017-12-18 20:42:12 · 89 阅读 · 0 评论 -
144. Binary Tree Preorder Traversal
1、题目描述输入一个二叉树,返回它的先序遍历。2、思路非递归法。声明stack。当root非NULL时,把root的val放入ans,若root的right非NULL,将right放入stack,令root = root的left。若root为NULL,则取出stack的最顶节点,让它等于root。这样就保持了先输出根节点,再左节点最后右节点的先序遍历。原创 2017-12-20 11:41:29 · 73 阅读 · 0 评论 -
94. Binary Tree Inorder Traversal
1、题目描述输入一个二叉树,返回它的中序遍历。2、思路way 1: Recursive Solutionway 2:Iterative Solution声明一个stack,把根节点放进去,把根节点的左节点放入,循环这个过程,知道左节点是NULL。把stack顶的节点root取出,把节点数值放入ans,若root的右节点非NULL,把右节点放入stack,把右节点的左原创 2017-12-20 11:28:43 · 103 阅读 · 0 评论 -
98. Validate Binary Search Tree
1、题目描述输入一棵二叉树,判断它是否是BST。2、思路中序排序。判断是否后一个元素一直大于前一个元素。3、代码 bool isValidBST(TreeNode* root) { vectorv; inorder(root,v); for(int i=1;i<v.size();i++){原创 2017-12-19 20:39:53 · 72 阅读 · 0 评论 -
100. Same Tree
1、题目描述判断两个树是否相同。2、思路递归思想。3、代码 bool isSameTree(TreeNode* p, TreeNode* q) { if(p==NULL&&q==NULL) return true; else if(p==NULL||q==NULL) retur原创 2017-12-19 20:36:06 · 85 阅读 · 0 评论 -
88. Merge Sorted Array
1、题目描述给两个升序数组,返回数组升序融合,融合到数组1里去。2、思路从后往前模拟。3、代码 void merge(vector& nums1, int m, vector& nums2, int n) { int i = m-1,j=n-1,k=m+n-1; while(i>=0&&j>=0){原创 2017-12-17 12:59:18 · 73 阅读 · 0 评论 -
108. Convert Sorted Array to Binary Search Tree
1、题目描述给一个升序数组,将它生成平衡BST。 2、思路最中间的元素作为根节点,左边的元素生成左子树,右边生成右子树。 3、代码 TreeNode* sortedArrayToBST(vector<int>& nums) { int n = nums.size(); if(n==0) ...原创 2018-12-26 01:53:48 · 109 阅读 · 0 评论 -
109. Convert Sorted List to Binary Search Tree
1、题目描述输入一个有序链表,将其转换成平衡的BST。 2、思路如果链表中节点数量为奇数,则刚好取所有节点的中点,用这个数字来生成树的根节点。左右两边可以划分为两个长度相等的链表,分别生成树的左子树和右子树。如果链表中节点数量为偶数,则取中线靠前的一个位置的节点,让它当根节点。左边的链表长度比右边的少1,分别生成树的左子树和右子树。时间复杂度O(nlogn)。 ...原创 2018-12-26 01:53:31 · 122 阅读 · 0 评论 -
112. Path Sum
1、题目描述给出一个二叉树和一个target,判断有没有一条从根节点到叶子节点的路径,使得路径上的节点数值之和等于target。 2、思路BFS:每次放入queue的都是从根节点到当前节点的节点数值之和。如果当前有左右节点,则将其分别加上左右节点数值,放入queue,若当前节点是叶子节点,则判断当前和是否是target。 DFS:初始值sum为root->val,...原创 2018-12-26 01:53:07 · 89 阅读 · 0 评论 -
114. Flatten Binary Tree to Linked List
1、题目描述把一个二叉树转换成链表。 2、思路转换成的链表形式是 根节点-左子树形成的链表-右子树形成的链表递归。 3、代码 void flatten(TreeNode* root) { if(!root) return; else root = helper(root); } Tree...原创 2018-12-26 01:52:46 · 67 阅读 · 0 评论 -
115. Distinct Subsequences
1、题目描述输入字符串s和t,有多少种方式让s删删减减形成t。 2、思路动态规划。具体看代码吧。 3、代码 int numDistinct(string s, string t) { int l1=s.size(),l2=t.size(); if(l1<l2) return 0; int dp[l1+1...原创 2018-12-26 01:52:28 · 104 阅读 · 0 评论 -
118. Pascal's Triangle
1、题目描述输入行数n,形成帕斯考三角形。 2、思路观察特点,模拟。 3、代码 vector<vector<int>> generate(int numRows) { vector<vector<int>> ans; if(numRows==0) return ans; ...原创 2018-12-26 01:52:08 · 76 阅读 · 0 评论 -
119. Pascal's Triangle II
1、题目描述输入k,返回xxx三角形第k行。2、思路模拟。3、代码 vector<int> getRow(int rowIndex) { vector<int> ans; ans.push_back(1); for(int i=1;i<=rowIndex;i++){ ...原创 2018-12-26 01:51:49 · 75 阅读 · 0 评论 -
120. Triangle
1、题目描述给一个由数组组成的数组,三角形的,返回从顶到底的最短路径和。 2、思路一层层更新。更新每一层走到每个位置的最小值。返回最后一行的最小值。 3、代码 int minimumTotal(vector<vector<int>>& triangle) { int n = triangle.size()...原创 2018-12-26 01:51:28 · 82 阅读 · 0 评论 -
147. Insertion Sort List
1、题目描述给一个链表,实现它的插入排序2、思路复杂度O(n^2)。对于每个节点,都在已经排好序的链表中找到它应该在的位置,将其插入,形成长度加1的新的有序链表。重复上述操作,直至所有节点都被插入。3、代码 ListNode* insertionSortList(ListNode* head) { ListNode* ans = n原创 2017-12-22 17:32:25 · 95 阅读 · 0 评论 -
146. LRU Cache
1、题目描述设计一个LRU的缓存机制。实现get和put函数。2、思路用map m记录cache中每个键值对。用map rec记录每个键被访问的时间戳。get函数:如果在m中能找到key,则返回,且更新时间戳;若找不到,则返回-1.普通函数:如果m中能找到key,则更新key对应值,以及时间戳;如果找不到,若cache没满,则直接插入键值对,和对应的时间戳对。原创 2017-12-22 17:44:15 · 112 阅读 · 0 评论 -
1. Two Sum
1、题目描述 输入一个数组和一个target,输出两个数组元素的索引,使得这两个数之和等于target,每个数组元素只可以用一次。 2、思路Hash Table。对于每个元素,check一下(target - 当前元素)是否在map中。如果在,输出map中保存的索引值和当前索引值;如果不在,将(target - 当前元素)和当前索引值存入map中。...原创 2017-12-14 14:05:34 · 139 阅读 · 0 评论 -
167. Two Sum II - Input array is sorted
1、题目描述输入一个递增的数组和一个target。输出两个元素的索引使得两元素之和等于target。2、思路Two Pointers。i指向数组头,j指向数组尾巴。nums[i] + nums[j] > target, j--;nums[i] + nums[j] nums[i] + nums[j] == target, return i and j.复原创 2017-12-14 14:23:07 · 83 阅读 · 0 评论 -
653. Two Sum IV - Input is a BST
1、题目描述输入一个BST和一个target,如果树上两元素之和等于target返回true,反之返回false。2、思路对BST进行中序遍历,得到一个升序序列。再按照two sum II的方法用two pointers思路求解。Time Complexity: O(n), Space Complexity: O(n).3、代码 bool findTarge原创 2017-12-14 14:45:01 · 116 阅读 · 0 评论 -
460. LFU Cache
1、题目描述原创 2017-12-22 19:21:47 · 334 阅读 · 0 评论 -
139. Word Break
1、题目描述输入一个字符串s和一个字符串数组dict。判断s是否可以由dict的一些字符串组成。2、思路动态规划。dp[i][j]表示s的前i位用dict的前j个字符串能不能表示。dp[0][i] = true;如果dp[i][j-1] is true, then dp[i][j] is true.dp[i-k][j] is true and s.substr(原创 2017-12-22 20:15:22 · 131 阅读 · 0 评论 -
143. Reorder List
1、题目描述输入一个单链表,对它重新排序,0,n,1,n-1,2,n-2,……2、思路把链表分成前后两部分。后部分逆序。再按照两个链表交叉的顺序形成新的链表。3、代码 void reorderList(ListNode* head) { if(!head||!head->next) return;原创 2017-12-22 20:56:07 · 86 阅读 · 0 评论 -
150. Evaluate Reverse Polish Notation
1、题目描述给一个逆波兰的数学表达式,也就是二叉树的后序排序,返回表达式的计算值。2、思路stack,把数值放到stack里,遇到加减乘除,pop出俩元素计算结果,把结果放到stack里。3、代码 int evalRPN(vector& tokens) { int n = tokens.size(); stacks;原创 2017-12-22 21:01:51 · 97 阅读 · 0 评论 -
151. Reverse Words in a String
1、题目描述输入字符串s,把每个用空格分开的单词逆序。2、思路模拟3、代码 void reverseWords(string &s) { string str; int l = s.size(); for(int i=l-1;i>=0;i--){ while(s[i]!=' ' &&i原创 2017-12-22 21:07:07 · 92 阅读 · 0 评论 -
169. Majority Element
1、题目描述给一个长度为n的数组,返回它的主要元素。主要元素定义是出现次数超过n/2的元素。2、思路声明一个答案君ans,初始化为nums[0];声明一个计数君cnt,初始化为1,他表示ans这个数字出现的次数。现在是1次。遍历数组,若当前数字等于ans,则cnt加1,反之cnt减1;当cnt等于0的时候,说明在之前的这些元素中,ans和其他元素的出现的次数刚好相等原创 2017-12-22 22:36:23 · 87 阅读 · 0 评论 -
179. Largest Number
1、题目描述给一个数组,连接数组中的所有数字,形成一个长数字,返回形成的最大数字。2、思路对数字转换成字符串,对字符串重新排序,再连接。主要处理0的情况。3、代码 string largestNumber(vector& nums) { vectorv; for(int i=0;i<nums.size();i++){原创 2017-12-22 22:45:35 · 129 阅读 · 0 评论