![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
RaKiRaKiRa
Shoot low, Aim high!
展开
-
要把博客拾起来了,颓废了好几个月
从零开始刷LeetCode,开始看书!原创 2019-02-28 16:44:05 · 202 阅读 · 0 评论 -
78. Subsets
题意:给一个包含多个数字的数组,返回这些数字组成的所有的子数组的集合。思路:dfs每遇到一个数均有两个选择:①将其加入子数组 ②跳过这个数。当遍历到数组末尾的时候,将得到的子数组加入结果集。void dfs(vector<int>& nums, vector<int> &cur, vector<vector<int>> &a...原创 2018-10-21 21:30:34 · 137 阅读 · 0 评论 -
94. Binary Tree Inorder Traversal(+树的遍历非递归)
题意:非递归中序遍历。树的先序遍历vector&lt;int&gt; preorderTraversal(TreeNode* root) { stack&lt;TreeNode*&gt; s; vector&lt;int&gt; res; TreeNode *p = root; while (p || !s.empty()) { while (p) { s.push(p);...原创 2018-10-25 21:12:05 · 147 阅读 · 0 评论 -
91. Decode Ways
题意:给一个由数字组成的非空字符串,1对应A,2对应B,… ,26对应Z,问这个字符串可以转换成多少种编码。思路:动态规划与跳台阶题的思想类似,但是对于跳一阶和跳两阶加了条件。dp[i]表示s[0]~s[i-1]的可编码个数。若s[i-1]属于1~9,dp[i]+=dp[i-1]所s[i-2] s[i-1]属于1~26,dp[i]+=dp[i-2]int numDecodings(s...原创 2018-10-25 20:40:29 · 105 阅读 · 0 评论 -
76. Minimum Window Substring 与 滑动窗方法问题总结
题意:给两个字符串s和t,在s中寻找包含t中全部字符的最短子串.滑动窗算法:https://blog.csdn.net/haolexiao/article/details/54781671滑动窗方法算是解决数组或者字符串中,处理连续的字符串段应该想到的一种方法,这里面有变长滑动窗,和定长滑动窗。滑动窗问题总共要处理两个方面,一个是新加入点和处理和移除滑动窗点点的处理。void slidi...原创 2018-10-20 21:11:28 · 154 阅读 · 0 评论 -
75. Sort Colors
题目:一个数组包含0,1,2,对他们进行排序思路1: two-pass大家都能想到的,对0 1 2进行计数,然后重新调整数组,共遍历两次void sortColors(vector<int>& nums) { //two-pass int red = 0, white = 0, blue = 0; for_each(nums.begin(), nums.end(),...原创 2018-10-20 16:53:36 · 93 阅读 · 0 评论 -
44. Wildcard Matching
题意:与之前的leetcode10. Regular Expression Matching类似。给两个字符串s和p,p中包含?和*,其中?可以替代一个字符,*可以替代一个字符串,问p和s是否匹配。思路:动态规划设置二维数组dp,dp[i][j]代表s[ 0 : i-1 ]和p[0 : j-1]是否匹配。设置dp[0][0]=1,因为空串和空串必然匹配。将p串前列的*与空s串匹配。当p...原创 2018-10-10 22:57:14 · 98 阅读 · 0 评论 -
42 Trapping Rain Water
题意:给一个数组,每个值表示一个高度,问这样围出的图形可以盛多少水。上图是[0,1,0,2,1,0,1,3,2,1,2,1]所围成图形。思路1:每个位置可以盛水的量是由左边最高的柱子高度和右边最高的柱子高柱的较小值与当前位子的柱子高度决定的。如图#define MIN(a,b) (a&gt;b?b:a)#define MAX(a,b) (a&lt;b?b:a)int trap(v...原创 2018-10-10 21:56:53 · 104 阅读 · 0 评论 -
66. Plus One
题意:提供一个数组按位表示一个整数,将这个整数加一并按位存于一个数组,并返回。举例:Input: [1,2,3]Output: [1,2,4]思路:STL的使用+逻辑性判断,easy题。设置一个flag表示进位,初始flag=1。从最后一位开始使其+flag,若此时该位大于9,则变成0且flag置1,否则退出循环。退出循环后若flag仍然为1,则在头部加一个1.vector&...原创 2018-10-17 14:07:49 · 117 阅读 · 0 评论 -
62. Unique Paths
题意:给一个m * n的二位数组,表示一个地图,[0][0]位置有一个机器人,只可以向左走或向下走,判断到达右下角的路线数量。思路:动态规划dp[i][j]表示到达[i , j]位置的路径数量,可以得到dp递推式i>0&&j>0 : dp[i][j]=dp[i-1][j]+dp[i][j-1]i=0||j=0 : dp[i][j]=1代码:int un...原创 2018-10-17 13:46:33 · 99 阅读 · 0 评论 -
73. Set Matrix Zeroes
题意:一个m * n数组若一个数为0,则将其所在的行、列所有数都设置为0,要求使用In-Place 算法。In-Place在原数组空间进行操作,即使空间复杂度为O(1)。思路1:空间复杂度O(mn)void setZeroes(vector<vector<int>>& matrix) {//O(mn) if (matrix.empty() || matr...原创 2018-10-19 21:40:09 · 87 阅读 · 0 评论 -
70. Climbing Stairs
题意:跳台阶问题,假设一共有n阶台阶,每次可以选择跳一阶或者两阶,问有多少种不同的跳法可以到达终点。思路:动态规划设dp[i]表示达到第i阶的跳法数量。第n阶台阶可以从第n-1阶跳一阶或者从第n-2阶跳两阶,也就是可以得到公式:dp[i]=dp[i - 1] + dp[i - 2]。int climbStairs(int n) { if (n <= 1) return 1; i...原创 2018-10-19 19:49:18 · 98 阅读 · 0 评论 -
79. Word Search
题意:在一个二维数组中是否可以匹配到一个字符串,这个字符串在二维数组中可以拐弯,但必须连续。思路:深搜+回溯遍历数组,若数组中元素等于字符串第一个字符进入深搜。深搜中有一个参数k,表示已经匹配的字符数,若k==word.size(),则表示字符串完全匹配成功。有一个二维数组参数flag,flag[i][j]表示i j位置是否已经被划入匹配范围,若flag[i][j]=0,则表示已匹配,后...原创 2018-10-21 22:23:58 · 103 阅读 · 0 评论 -
55. Largest Rectangle in Histogram
题意给一个包含n个非负数的数组,表示n个宽度为1的直方柱,求可以用长方形圈出来的最大面积。思路1:以上图为例,我们用一个res表示目前得到的最大面积,首先第一次扫描数组,获得最矮直方体1,res=1*6。然后若获得比这个面积大的面积,肯定是要剔除该高度为1的直方柱。故求1左面和1右面,递归。int func(vector<int>& heights, int lef...原创 2018-10-24 10:05:32 · 119 阅读 · 0 评论 -
102. Binary Tree Level Order Traversal
题意:树的层次遍历,基础数据结构题。代码struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};struct Node { TreeNode *TN; int L; Node(TreeNode *t, ...原创 2018-10-29 19:00:25 · 91 阅读 · 0 评论 -
122 .Best Time to Buy and Sell Stock II
题意:有一组数组,第i个数表示第i天的股票价格,可以买卖任意次,问最多可以赚多少钱。思路:避免跌的情况即可。int maxProfit(vector<int>& prices) { int sz = prices.size(), res = 0; for (int i = 1; i < sz; ++i) { if (prices[i] > pric...原创 2018-11-05 18:17:54 · 160 阅读 · 0 评论 -
121. Best Time to Buy and Sell Stock
题意:给一组数组,第i个数表示第i天某物品的价格,问若在某一天买入某一天卖出,则最多可以赚多少钱。思路:easy题。。。在第i天卖出最多可以赚当天价格减去之前价格的最小值,从左向右遍历数组,用一个数记录最小值,一个数记录最多可以赚的钱。int maxProfit(vector<int>& prices) { if (prices.empty()) return 0...原创 2018-11-05 17:54:56 · 135 阅读 · 0 评论 -
118. Pascal's Triangle
题意:杨辉三角形,没啥好说的思路:以前数据结构书上讲过一种用队列求杨辉三角形的方法,我给忘了。。。用了类似dp的方法,应该是比用队列要好些的。vector<vector<int>> generate(int numRows) { if (!numRows) return vector<vector<int>>(); list<...原创 2018-11-05 17:39:55 · 111 阅读 · 0 评论 -
116. Populating Next Right Pointers in Each Node
题意:将一颗二叉树的节点使用每个节点中的next指针将每行从左向右连接起来。思路:层次遍历每次加入链表同时加入对应的行号,若前一节点与当前节点行号不同则前一节点指向NULL。struct Node { TreeLinkNode *TLN; int L; Node(TreeLinkNode *T, int i) :TLN(T), L(i) {};};void connect(Tr...原创 2018-11-02 19:07:25 · 138 阅读 · 0 评论 -
108. Convert Sorted Array to Binary Search Tree
题意:生成二叉平衡树。思路:递归struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};TreeNode* sortedArrayToBST(vector<int>& nums, int ...原创 2018-11-02 17:22:15 · 136 阅读 · 0 评论 -
125. Valid Palindrome
题意:给一个字符串,只判断数字和字母,且不区分大小写,其他忽略,判断是否回文。思路:ps:这是我们今年复试上机题,我写的程序这里能跑过,复试的时候没给我满分。。。残念。bool isPalindrome(string s) { if (s.empty()) return true; string a = ""; for_each(s.begin(), s.end(), [&...原创 2018-11-06 20:46:20 · 129 阅读 · 0 评论 -
124. Binary Tree Maximum Path Sum
题意:给一颗二叉树,寻找一个路径,满足路径上的节点值的和最大。这个路径可以是任意起点和任意终点。思路:后序递归,在每个节点处将其左右节点作为路径结尾且和大于0的左右子路径连接,判断新路径的和是否是最大。然后返回以该节点为结尾的最大路径。int fuc(TreeNode* root, int &res) { if (!root) return 0; int l = max(f...原创 2018-11-06 20:32:01 · 109 阅读 · 0 评论 -
88. Merge Sorted Array
题意:给两个已排序数组,合成一个已排序数组。简单题 没什么好说的代码:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { nums1.resize(m + n); int i = m - 1, j = n - 1, k = m + n - 1; while (k)...原创 2018-10-24 12:57:45 · 108 阅读 · 0 评论 -
101 Symmetric Tree
题意:判断一颗二叉树是否对称代码:bool comp(TreeNode* l, TreeNode* r) { if (l == NULL&&r == NULL) return true; if (l == NULL||r == NULL) return false; if (l->val != r->val) return false; ret...原创 2018-10-26 21:17:07 · 170 阅读 · 0 评论 -
98. Validate Binary Search Tree
题意:判断一个数是否是二叉搜索树。思路:二叉排序树的任意一个节点的左节点比其小,右节点比其大,那么中序遍历会得到一个有序数组。利用非递归遍历,每次的数都应该比上次的大,否则就不是BST。bool isValidBST(TreeNode* root) { if (!root) return true; if (!(root->right || root->left)) ...原创 2018-10-26 19:56:13 · 112 阅读 · 0 评论 -
104. Maximum Depth of Binary Tree
题意:求树的最大深度代码:void dfs(TreeNode* p, int &d,int i) { if (i > d) d = i; if (p->left) dfs(p->left, d, i + 1); if (p->right) dfs(p->right, d, i + 1);}int maxDepth(TreeNode...原创 2018-10-29 20:15:57 · 120 阅读 · 0 评论 -
103. Binary Tree Zigzag Level Order Traversal
题意:层次遍历树,一行从左向右,一行从右向左。思路:和之前普通层次遍历相仿,但将每层存于vector改为list,因为list倒序遍历较快。用一个flag控制每行的方向。struct Node { TreeNode *TN; int L; Node(TreeNode *t, int i) :TN(t), L(i) {};};vector<vector<int>...原创 2018-10-29 19:23:20 · 109 阅读 · 0 评论 -
56. Merge Intervals(速度不理想,之后再看)
题意:给一组范围,对这些范围进行合并,将结果输出。举例:Input: [[1,3],[2,6],[8,10],[15,18]]Output: [[1,6],[8,10],[15,18]]思路:根据逻辑暴力遍历,两个方法的速度都不理想,之后再想想vector<Interval> merge(vector<Interval>& intervals) {...原创 2018-10-16 21:18:28 · 116 阅读 · 0 评论 -
55. Jump Game
题意:给一个数组,每个数代表可以跳跃的最大距离,问是否可以跳到终点。思路1:暴力没什么好说的,特别慢。用一个数组表示i位置是否可以达到,然后遍历数组,将所有可以达到的位置置1.bool canJump(vector<int>& nums) { //暴力 特别慢 int sz = nums.size(); vector<int> jus(sz, 0); ...原创 2018-10-16 20:35:00 · 968 阅读 · 0 评论 -
54. Spiral Matrix
题意:给一个二维数组,按螺旋顺序将其放入一个一维数组里。举例:Input:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]Output: [1,2,3,6,9,8,7,4,5]思路:考察逻辑能力,纯粹的找规律,先自左向右取最上面一行,再自上而下取最右,自右向左取最下,自下而上取最左。每次都先检查释放已经取完。vector<int> ...原创 2018-10-16 19:50:22 · 125 阅读 · 0 评论 -
49. Group Anagrams
题意:给一组string,将所含字符相同的字符串分在一组。思路1:暴力求解把每个字符串拆成字符存在vector中,对其排序,用一个map把所含字符相同的字符串存在一个vector中。vector<vector<string>> groupAnagrams(vector<string>& strs) {//52ms map<vector&l...原创 2018-10-12 21:55:18 · 214 阅读 · 0 评论 -
5. Longest Palindromic Substring 最长回文子序列
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Example 1:Input: "babad"Output: "bab"Note: "aba" is also a valid answer.Example ..原创 2018-09-27 22:12:27 · 94 阅读 · 0 评论 -
20. Valid Parentheses
题意:Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.An input string is valid if:Open brackets must be closed by the same type of...原创 2018-10-05 16:13:05 · 94 阅读 · 0 评论 -
19. Remove Nth Node From End of List
Given a linked list, remove the n-th node from the end of list and return its head.Example:Given linked list: 1-&gt;2-&gt;3-&gt;4-&gt;5, and n = 2.After removing the second node from the end, the l...原创 2018-10-05 15:55:40 · 102 阅读 · 0 评论 -
17. Letter Combinations of a Phone Number
题目:Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) is...原创 2018-10-04 23:03:47 · 756 阅读 · 0 评论 -
48. Rotate Image
题意:给一个二位数组,将这个数组顺时针旋转90°并输出。只需在原数组上进行操作。思路:高中几何思路,虽然我也卡了好久才想出来。。。假设数组matrix[i][j]的i在x正半轴上,j在y正半轴上,数组是sz*sz大小的。顺时针旋转90°的结果实际上等同于,先将数组沿x=y对称,再将数组沿x=y对称。也等同于先将数组沿x=-y对称,再沿x=sz/2对称。代码:void rotate(v...原创 2018-10-11 21:17:52 · 102 阅读 · 0 评论 -
15. 3Sum
题意:给一堆数,找和为0的三个数,把所有可能情况都返回,但没有重复。思路用了最笨的方法,时间也耗得长,哎,好菜啊我。。。就是先把三个数的和为0转化成两个数的和为第一个数的相反数。先给数排序,按顺序选第一个数,然后后面按两数和来算。说几个注意的地方:①每次选了第一个数后做个判断,如果第一个数是正数,就可以直接break然后返回res了,因为第一个数是正数 那么后面肯定都是正数。注意,如果不...原创 2018-10-03 23:52:46 · 87 阅读 · 0 评论 -
46. Permutations
题意:给一个没有重复数的数组,列出这些数的所有顺序可能。思路:暴力解法。vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; res.push_back(vector<int>()); int sz = nums...原创 2018-10-11 20:19:37 · 119 阅读 · 0 评论 -
4. Median of Two Sorted Arrays 两个有序数组的中位数
题目:There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).You may assume nums1 and...原创 2018-09-26 22:01:23 · 71 阅读 · 0 评论 -
Longest Common Prefix
简单题 懒得多说了,反正也没人会看。bool func1(vector&lt;string&gt;&amp; strs, int sht) { char s = strs[0][sht]; for (int i = 1; i &lt; strs.size(); ++i) { if (s != strs[i][sht]) return false; } return true;...原创 2018-10-03 22:04:00 · 143 阅读 · 0 评论