随笔分类 - 算法随笔
摘要:给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。 实现 TreeAncestor 类: TreeAncestor
阅读全文
摘要:给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。 (如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先) 示例 1: 输入:root = [
阅读全文
摘要:给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。 给你一个二维整数数组 edges ,其中 edges[i] = [fromi, toi] 表示图中一条从 fromi 到 toi 的单向边。 请你返回一个数组 answer,其中 answer
阅读全文
摘要:柱状图中最大的矩形 题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode) 思路:掌握了……吗?还是参考了下官网思路。代码随想录 (programmercarl.com) class Solution { public: int largestRectangleArea(vector<i
阅读全文
摘要:下一个更大元素II 题目链接:503. 下一个更大元素 II - 力扣(LeetCode) 思路:这里处理循环数组的方式值得学习,用i%nums.size()和for循环的上限来模拟两层for循环。整体思路还是单调栈。 class Solution { public: vector<int> nex
阅读全文
摘要:每日温度 题目链接:739. 每日温度 - 力扣(LeetCode) 思路:很容易想到暴力解法。但超时也是很轻松的。 class Solution { public: vector<int> dailyTemperatures(vector<int>& temperatures) { // stac
阅读全文
摘要:回文子串 题目链接:647. 回文子串 - 力扣(LeetCode)思路:投降 class Solution { public: int countSubstrings(string s) { vector<vector<bool>> dp(s.size(), vector<bool>(s.size
阅读全文
摘要:两个字符串的删除操作 题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode) 思路:第一次尝试用画图法,然后肉眼观察dp递归规律……但是dp[i][j]的含义还是参考昨天的思路,表示到此处需要删除多少个字符。 class Solution { public: int minDista
阅读全文
摘要:判断子序列 题目链接:392. 判断子序列 - 力扣(LeetCode) 思路:从子串s开始遍历,查找t中是否存在,因为全程不需要回溯,因此两个for循环就解决了。只是要注意return的时机。(只要不想写的很简洁,逻辑挺简单的其实) class Solution { public: bool is
阅读全文
摘要:最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣(LeetCode) 思路:。 class Solution { public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>>
阅读全文
摘要:最长递增子序列 题目链接:300. 最长递增子序列 - 力扣(LeetCode) 思路:感觉有点像暴力? class Solution { public: int lengthOfLIS(vector<int>& nums) { if(nums.size()==1)return 1; vector<
阅读全文
摘要:最佳买卖股票时机含冷冻期 题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 思路:本题难点在于如何将冷冻期加入到状态转移方程中,不妨画个图: 按理来说,如何我们正处于买入状态,将股票卖出后,应该是冷冻状态,但是这里多加了一个今日卖出状态,就是将今日卖出和卖出状态分开看,避
阅读全文
摘要:买卖股票的最佳时机III 题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 思路:与买卖股票2的区别在于我可以买卖两次,那么dp数组的状态就从两种变成了种,即第一次持有,第一次卖出,第二次持有,第二次卖出,注意这四种状态是不会同时存在的,除此之外还有一种状态,那就是不操作
阅读全文
摘要:买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 思路:注意买卖只有一次。 暴力法,因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润: class Solution { public: int maxProfi
阅读全文
摘要:打家劫舍 题目链接:198. 打家劫舍 - 力扣(LeetCode) 思路:每一家的最大收益来源只有两个,一个是这家不偷,那么最大收益等于从上一家出来的最大收益,另一个是偷这一个家,因此最大收益等于从上上一家出来的最大收益加这一家的收益。 class Solution { public: int r
阅读全文
摘要:单词拆分 题目链接:139. 单词拆分 - 力扣(LeetCode) 思路:竟然真能转化为背包问题。 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string>
阅读全文
摘要:爬楼梯 (进阶) 题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com) 思路:笑嘻了,直接给默写出来了。 #include<bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n>>m; vector<in
阅读全文
摘要:完全背包 题目链接:52. 携带研究材料(第七期模拟笔试) (kamacoder.com) 思路:完全·背包问题和01背包的区别在于同一个物品可以被重复放入,在代码里的区别就是内部遍历背包的for循环由倒序变成了正序。而且如果我们压缩了一维的话,如我的做法,两个for循环的顺序也是无所谓的。 #in
阅读全文
摘要:最后一块石头的重量 II 题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 思路:尽可能将石头分成重量相近的两堆,结果一定最小,因此问题可以转换为分割子集。dp[i]的含义是背包容量为i的背包能装下的最大重量,由于题目中最大重量是15000,所以我们申请15001的vec
阅读全文
摘要:01背包问题,你该了解这些! 题目链接:46. 携带研究材料(第六期模拟笔试) (kamacoder.com) 思路:第一次遇到背包问题,好好记住吧。代码随想录 (programmercarl.com) #include<bits/stdc++.h> using namespace std; int
阅读全文