Leetcode
小小小楚楚
不学控制枉少年
展开
-
LeetCode 309股票问题,待冷冻期
class Solution {public: int maxProfit(vector<int>& prices) { int n = prices.size(); vector<vector<int>> dp(n, vector<int>(5)); dp[0][4] = -prices[0]; dp[0][0] = -prices[0]; for (int .原创 2021-04-26 13:47:51 · 58 阅读 · 0 评论 -
最小表示法
引理如果比较起始位置i ii和起始位置j jj发现s [ i , i + 1 … i + k − 1 ] = s [ j , j + 1 … j + k − 1 ] s[i,i+1\ldots i+k-1]=s[j,j+1\ldots j+k-1]s[i,i+1…i+k−1]=s[j,j+1…j+k−1]且s [ i + k ] < s [ j + k ] s[i+k]<s[j+k]s[i+k]<s[j+k]则起始位置j , j + 1 … j + k j,j+1\ldots j+kj.原创 2021-04-19 11:04:00 · 90 阅读 · 0 评论 -
计算器
收藏一份模板观察观察lass Solution {public: unordered_map<char,int> oper_pri = { {'+',1}, {'-',1}, {'*',2}, {'/',2}, {'%',2}, {'^',3} }; stack<char> opers; stack<原创 2021-04-04 21:45:13 · 60 阅读 · 0 评论 -
滑动窗口自定义标准化流程
右侧添加元素判断左侧是否收缩更新窗口最大(或最小)长度右指针+1class Solution {public: int lengthOfLongestSubstring(string s) { //滑动窗口,区间[left,right] int left = 0; int right = 0; unordered_map<char, int> mmap; int maxlen = 0; .原创 2021-03-25 20:57:17 · 134 阅读 · 0 评论 -
哈希表底层
原创 2021-03-24 12:20:06 · 105 阅读 · 0 评论 -
打家劫舍动态规划小结
打家劫舍198,条形的dp[i] = max(dp[i - 2] + nums[i],/偷第i家的/dp[i - 1]/不偷第i家的/);213环形的因为第一个和最后一个是不能挨着,也就是说,选了第一个就不能选最后一个。选了最后一个就是不能选第一个,所以问题可以分分解为两个子问题[0,end-1]的条形[1,end]的条形两个问题的max就是问题的解337 树状的同样的特点,决定该节点的就是偷还是不偷,因此我们定义一个二维的返回值分别代表偷或者不偷的最大受益,每次捡起最大的受益即可原创 2021-03-20 20:45:03 · 100 阅读 · 0 评论 -
对于背包问题的思考
对于动态规划的问题抽象成背包问题的时候我们要记得和背包的属性进行对应,这样方便问题的解决比如如下的类比原创 2021-03-19 19:44:54 · 90 阅读 · 0 评论 -
动态规划总结
原创 2021-03-17 09:04:43 · 49 阅读 · 0 评论 -
贪心算法小结
遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。例如 406.根据身高重建队列 135. 分发糖果要么从左到右,然后从右到左,两遍遍历,要么在确定一个逻辑的基础上再对另一个限制条件进行排序...原创 2021-03-15 20:03:14 · 120 阅读 · 0 评论 -
一次有关C++ 增强for循环遍历时候使用的不是引用的记录
记录一下遇到的小问题的解决对于for循环遍历,依次按顺序遍历对象的时候采用的并不是引用,因此我们在遍历时候需要加入引用来解决332. 重新安排行程class Solution {public: unordered_map<string, map<string, int>> targets; bool backtracing(int ticketsNum, vector<string>& result) { //结束条件原创 2021-03-14 12:08:23 · 332 阅读 · 0 评论 -
回溯算法要点记录
算法模板:如果是一个集合来求组合的话,就需要startIndex,例如:回溯算法:求组合问题!,回溯算法:求组合总和!。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:回溯算法:电话号码的字母组合...原创 2021-03-12 20:16:22 · 88 阅读 · 0 评论 -
二叉树总结记录
如果需要遍历整颗树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。数组转化为树的关键就是找分割点...原创 2021-03-12 19:45:23 · 54 阅读 · 0 评论 -
记一次对于中序遍历处理的混乱认知
二叉搜索树的最小绝对差犯了一些错误本来写的代码是这样的/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: .原创 2021-03-11 19:29:35 · 104 阅读 · 0 评论 -
递归的进一步探索
对于这个题目,在我思路还没有理清楚的时候写出了一个可以运行的代码class Solution {public: int sumOfLeftLeaves(TreeNode* root) { //终止条件 if (root == NULL) { return 0; } int lsum = 0; int rsum = 0; if (root->left != NULL &.原创 2021-03-10 19:41:41 · 51 阅读 · 0 评论 -
递归回溯算法小结
以257. 二叉树的所有路径为例之前忽略或者不成系统的点:一个递归,一个回溯递归是前序遍历,先处理本个节点的逻辑,然后处理左右节点处理左右节点的过程中,递归和回溯要点在于要一一对应这个对应关系是,我需要判断下一层可能发生的逻辑(比如它会将我的path添加了一个元素),然后在回溯里面做出处理(pop)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left原创 2021-03-10 11:54:44 · 137 阅读 · 0 评论 -
非递归的前中后序遍历二叉树
非递归的前中后序遍历二叉树模板思路:使用栈模拟递归方法,只不过注意进出的顺序要点:谁是要遍历的位置的节点,就将它放进去,然后再塞进去个null,在处理到是Null时,就再拿出一个节点作为当前的值如果不是Null,那么就按顺序将它的左右子树放进栈/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2021-03-07 22:50:22 · 54 阅读 · 0 评论 -
有序队列
很有参考意义的一个题仔细分析逻辑之后可以参考写出有序队列的代码:class Solution {public: //要点:新的大数的到来可以直接影响到前面的小数,让他们的离开变得无关紧要。毕竟窗口里面已经有了比他们大的数。 class MyQueue { public: deque<int> que; //新的数进来,会使得比它小的数变得无关紧要,因为比它小的在它的前面比它先走,所以不可能是这个队列里的最大值了 void p原创 2021-03-06 23:31:52 · 598 阅读 · 0 评论 -
数组专题:二分法
刷题重来,打算按专题开始搞,看看前辈的经验,总结一下二分法的判断:如果我认为target在[left,right]里,那么我的判断条件应该定为left<=right,如果出了我的判断,那么只可能会是 right在left的左边,这时候最佳的插入位置为left或者right+1;同理如果我认为target在[left,right)里,那么判断条件应该为left<right,这样的话如果出了我的判断结束条件,只可能会是left=right,这时候最佳的插入位置为left或者right都可以以原创 2021-03-04 14:06:19 · 108 阅读 · 1 评论 -
91. 解码方法
思路:动态规划为什么呢?因为我发现在最后加上一个数或者去掉一个数和前面的问题是一个问题,没有什么不一样,所以应该是后面的问题其实就应该在前面的问题下继续黑箱判断就可以了,和高中学的整体法一样。具体点呢?原来一共有n个,我加了个数进去,如果它不能和前面组成一队,那么总的个数就是,把他自己当成一组,前面多少个它也就还是多少个。dp[i]=dp[i-1]如果它可以和前面的组成一组,那么分组就应该是。他自己一个数一组,和上面一样,共有dp[i-1]个它和前面的那个那个数一组,其它的数一组,共有原创 2021-02-01 20:17:13 · 133 阅读 · 0 评论 -
90. 子集 II
90. 子集 II还是树的思想,同一层的不能重复,其实也就是看一下每一层的开头就行了i>start就很巧妙的解决了这一点class Solution {public: vector<int> nums; int n; vector<vector<int>> result; //每一层的任务就是看看能不能往下一层放东西 void dfs(int depth,int start,vector<int> cur) { if (depth原创 2021-01-21 21:46:22 · 38 阅读 · 0 评论 -
88. 合并两个有序数组
88. 合并两个有序数组从屁股插入就可以了class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int index1 = m - 1; int index2 = n - 1; int cur = m + n - 1; while (index1 >= 0 && index2 >= 0) {原创 2021-01-18 19:06:56 · 78 阅读 · 1 评论 -
86. 分隔链表
86. 分隔链表找个大头记录连接着大于目标值的找个小头记录连接小于目标值的最后串起来即可真巧妙,居然链表没乱。因为我遍历的时候是从头到尾一直在跑的,至于我走过的路变成了什么样子,我不关心,只要别挡我的路就行/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {}原创 2021-01-15 23:10:34 · 57 阅读 · 0 评论 -
85. 最大矩形
85. 最大矩形将矩形抽象成84,柱状图即可class Solution {public: int largestRectangleArea(vector<int>& heights) { stack<int> st; st.push(-1); int maxArea = 0; int n = heights.size(); for (int i = 0; i < height原创 2021-01-15 22:23:57 · 58 阅读 · 0 评论 -
84. 柱状图中最大的矩形
84. 柱状图中最大的矩形思路:方法一:如果暴力解法,对于某一个柱子,我们让它往两边找,直到找到坑为止就算到头了,然后算面积就是了但是这样也发现,如果我们从头往后遍历,要是下降了,那后面的肯定是前面那个的右边界,对应的他的左边界可以自己往前去搜索一下可以用while()一直找到比它小的heights,然后就是它的左边界但是这样的话,很容易出现重复的遍历方法二对于某个柱子如果它后面是 严格下降的话,那它的右边界就是他本身,到头了如果后面是 上升的话,那么它的右边界是不能确定的,需要往后找原创 2021-01-15 21:37:05 · 55 阅读 · 0 评论 -
83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素思路:双指针/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* deleteDuplicates(ListNode* head) {原创 2020-12-28 18:04:19 · 38 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II思路:预定一个preHead指向head如果发现我的next->val==next->next->val那派出个快指针去找不重复的位置,preHead指向它,再次进行判断,如果符合标准,那么做指针指向这个节点第一次写的成坨的代码/* 思路:预定一个preHead指向head 如果发现我的next->val==next->next->val 那派出个快指针去找不重复的位置,preHead指向它,再次进行判断,如果符合标准原创 2020-12-28 17:49:10 · 39 阅读 · 0 评论 -
81. 搜索旋转排序数组 II
81. 搜索旋转排序数组 II思路:二分法,肯定能分到有序的一半和无序的一半,如果不在有序的一半那就在无序的那一半里面问题在于对于有序的一半的判断一开始想当然的,nums[left]<=mid就是在左半边,否则再右半边,但是这个等号是最难辨别的因为如果mid是中间的话最难分辨了1,3,1,1,1,11,1,1,1,3,1都是不能分辨出来的,因此应该单独拿出来分析,采用缩短区间的方式慢慢的搞了只能class Solution {public: bool search(ve原创 2020-12-28 16:43:19 · 47 阅读 · 0 评论 -
80. 删除排序数组中的重复项 II
80. 删除排序数组中的重复项 II思路:双指针class Solution {public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) { return 0; } int cnt = 1;//记录我左边接收到几个相同的了 int left = 1, right = 1;//left:指向坑位,right指向要比较的。 while (right < nums.size())原创 2020-12-28 11:21:04 · 47 阅读 · 0 评论 -
79. 单词搜索
79. 单词搜索思路:回溯上下左右挨个找一遍但是在写代码过程中遇到了一些问题非常烦。处理过程中边界总是划分不清另外回溯过程中尽量先写不成立的,然后return回去,不然太难搞了class Solution {public:bool dfs(int x, int y, int index, vector<vector<char>>& board,string& word, vector<vector<bool>>& vis原创 2020-12-28 10:03:05 · 38 阅读 · 0 评论 -
78. 子集
78. 子集思路:二进制掩码对于n位数,有2^n种可能性,用二进制表示其对应的位的有无即可class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> result; vector<int> temp; int n = nums.size(); // [][] 1<<原创 2020-12-27 18:03:56 · 33 阅读 · 0 评论 -
77. 组合
77. 组合递归,递归的只找比自己大的就行了class Solution {public: int n; int k; vector<vector<int>> result; void dfs(int depth,int start,vector<int>& cur) { if (depth == k) { result.push_back(cur); return; } for (int i = start +原创 2020-12-27 16:50:15 · 59 阅读 · 0 评论 -
76. 最小覆盖子串
最小覆盖子串class Solution {public:bool findChar(unordered_map<int, int>& ori, char& c) { if (ori.find(c) != ori.end()) { return true; } else { return false; }} string minWindow(string s, string t) { int left = 0; int sleft =.原创 2020-12-27 16:09:08 · 51 阅读 · 0 评论 -
75. 颜色分类
75. 颜色分类 简单的思路:计数排序,数一数0 2的个数,然后1=剩下的,再重新赋值一遍即可 但是如果要求一遍遍历的话,我们可以用双指针替换掉相应的空间消耗 //75. 颜色分类/* 思路: 简单的思路:计数排序,数一数0 2的个数,然后1=剩下的,再重新赋值一遍即可 但是如果要求一遍遍历的话,我们可以用双指针替换掉相应的空间消耗 */class Solution {public: void sortColors(vector<int>& nums原创 2020-12-26 09:33:19 · 72 阅读 · 0 评论 -
74. 搜索二维矩阵
74. 搜索二维矩阵思路:二分法将二维数组展开成一维的再二分就可以/*思路:二分查找 */class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m = matrix.size(); int n = matrix[0].size(); if (m * n == 0) { return false; } int left原创 2020-12-26 08:46:16 · 71 阅读 · 0 评论 -
73. 矩阵置零
73. 矩阵置零除了烦了点,别的还好class Solution {public:void makeRowZero(vector<vector<int>>& matrix,int row) { for (int j = 0; j < matrix[0].size(); j++) { matrix[row][j] = 0; }}void makeColZero(vector<vector<int>>& matrix,原创 2020-12-25 13:28:12 · 55 阅读 · 0 评论 -
72. 编辑距离
72. 编辑距离这个题好难,完全没啥思路,想了以后也是很困难,看到这个大佬的解答比较不错编辑距离面试题详解原创 2020-12-25 10:48:15 · 51 阅读 · 0 评论 -
71. 简化路径
71. 简化路径又是一道写的并不是很完美的代码逻辑并不完美,处理头和尾的时候总是会有些问题回头改进一下/*需要解决的问题: 1.尾部有/的去掉 2.带..的,将前面的删除掉 3.根目录的带 ..还是根目录 4.双斜线的去掉一个 5. . 表示当前的路径,没啥用,去掉思路:搞个队列,从头到尾的遍历这个串, 遇到'/'就结束当前记录的串 检查当前的串的内容 如果不是'.' 或者 '..'直接塞进栈 如果是'.' 不理会,接着看后面了 如果是'..',弹出一个 while(s原创 2020-12-23 20:17:06 · 67 阅读 · 0 评论 -
70. 爬楼梯
70. 爬楼梯思路:1.递归,每次选择减去1或者减去2,最终减出来是0就返回2.动态规划,如果我找到n条路,你再多出来一阶,同样得+1,多两阶,+2以此(怎么好像有规律),所以到第n阶的情况的条数fn=fn-1+fn-2/*思路:1.递归,每次选择减去1或者减去2,最终减出来是0就返回2.动态规划,如果我找到n条路,你再多出来一阶,同样得+1,多两阶,+2以此(怎么好像有规律), 所以到第n阶的情况的条数fn=fn-1+fn-2*/class Solution {public:原创 2020-12-23 18:26:16 · 68 阅读 · 0 评论 -
69. x 的平方根
69. x 的平方根思路:牛顿迭代法数值分析很经典的迭代方法,用到这个例子中恰好从图形上可以看出来x^2它的收敛不会说左边一下,右边一下,左右波动,因此我们结束的判断条件可以采用f(x)=x*x-c<0来进行判别。而且根据其取整的性质,一定是可以转移到根的左边class Solution {public: int mySqrt(int c) { long x = c; while (x * x > c) { x = (x * x + c) / (x * 2);原创 2020-12-23 13:11:36 · 78 阅读 · 0 评论 -
68. 文本左右对齐
68. 文本左右对齐office word开发既视感思路没啥复杂的,就是模拟,但是调试过程会比较烦人思路每次往里面塞,记录当前塞进去的 单词数 和 长度如果发现往下塞下一个单词的时候,长度超过这一行了,停止塞了。计算一下每个单词的空格数=(本行的长度-塞进去的单词长度)/单词数循环上面过程,直到塞进当前的这个是结尾了,直接把前面的一股脑塞进去/*思路:模拟每次往里面塞,记录当前塞进去的 单词数 和 长度如果发现往下塞下一个单词的时候,长度超过这一行了,停止塞了。计算一下每个单词的空原创 2020-12-23 09:29:28 · 73 阅读 · 0 评论