251012 record best-time-to-buy-and-sell-stock
发表于|更新于|record
|总字数:78
1 | int maxProfit(vector<int>& prices) { |
这个模板可以用于:寻找不单增数组的元素与该元素前面的所有元素之差的最大值。
文章作者: Eliano
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!
相关推荐
2025-11-01
251101 record closest-equal-element-queries
题目 12345678910111213141516171819vector<int> solveQueries(vector<int>& nums, vector<int>& queries) { map<int,vector<int>>mp; for(int i=0;i<nums.size();++i){ mp[nums[i]].push_back(i); } int n = queries.size(); vector<int>ans(n,-1); for(int j=0;j<n;++j){ int q = queries[j]; auto & vec = mp[nums[q]]; if(vec.size()==1){ ...
2025-07-21
250721 thinking 二分查找
1. 总结二分查找的原理非常简单,但是一些细节例如是 l<r还是 l<=r、更新 r时是 r=mid还是 r=mid-1(l同理)等地方却有些让人头疼,实际写来如果不注意就可能会造成死循环。 于是总结一种模板: 定义域为[lo, hi)的单增的f(x), 找出最小的ans, 使得f(ans)>0成立。 单减同理,甚至可以进行预处理先转化为单增的情况。 伪代码如下: 12345678910111213141516algorithm binary-search(lo,hi) while the search area has elments do: mid <- lo + (hi-lo)/2; if f(mid) satisfied: // the answer may occur here ans := mid; hi <- mid; // the search area could have no elments when in the next loop, so return ans; ...
2025-07-21
250721 thinking 单调栈
他向远方望去,无法看到高山背后的矮山,只看到一座座更高的山峰。————by 灵神 1. 总结单调栈就是保持栈内元素单调的栈。当新元素破坏单调性时,弹出栈顶元素,弹出的瞬间就找到栈顶元素对应的答案。 栈里存放着暂时还没有找到对应答案的元素。新元素入栈时,如果栈顶元素使得栈单调性被破环,那么栈顶元素的答案产生,栈顶元素找到答案,出栈。因此需要建立的栈的单调性与题目的答案需求往往是“反过来”。要下一个更大就要单减;要下一个更小就要单增。 12345678910algorithm generalized-monotonic-stack(A, cmp, process) stack S ← ∅ for i ← 0 to n-1 do: while S ≠ ∅ and condition(A[i], A[S.top()]) do: // 栈的单调性被破坏,while是为了让栈里满足条件的元素都可以出栈 j ← S.pop() // 栈顶出栈 recordAnswer(j, i) // 计算并记录栈顶对应的答案 ...
2025-08-24
250824 thinking Trie
字典树(Trie)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。每个节点有26个子节点,子节点的序号分别代表26个字母。因此,从根节点到某个节点的路径表示一个字符串。有时候,每个节点会有一个标记,用于表示是否为一个字符串的结束。如果一个节点的标记为true,那么从根节点到该节点的路径表示的字符串就是一个单词。 C++示例以下是一个简单的C++实现,支持插入、搜索和前缀搜索。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Node {public: int end; vector<unique_ptr<Node>> son; Node():end(0),son(26){};};class Trie {public: unique_ptr<Node> root; Trie() { ...
2025-08-04
250728-250803 周记 缓存池项目学习
本周主要跟着代码随想录学习了LRU, LFU, 以及ARC三种缓存替换算法的原理和C++实现。 1. LRULRU是Least Recently Used的缩写,即淘汰最近最少使用的元素。 缓存的实现使用了一个哈希表和一个双向链表。哈希表用于快速查找缓存中的元素,双向链表用于维护缓存中的元素顺序。 每当涉及一个元素的key时,将该元素移动到双向链表的头部。当缓存满时,将双向链表的尾部元素删除。同时将该元素从哈希表中删除。 1.1 改进以上的LRU存在着缓存污染、锁的粒度过大的问题。 缓存污染:当新加进来的一次性的数据很多,导致缓存满时,传统的LRU会直接删除尾部元素。但是,尾部元素可能是热门数据。锁的粒度大:一把大锁锁全局。多线程高并发的访问下,同步等待将是一笔极大的时间开销。 故考虑以下改进: 1.1.1...
2025-08-24
250824 thinking 二叉树遍历的迭代法
关于二叉树的遍历,有递归法和迭代法两种。递归法简单易懂,但是迭代法较为复杂,需要使用栈来模拟递归的过程。 这里以“将二叉树按某种顺序遍历输出”为例,介绍迭代法的实现。 关键在于理解某个节点输出的时机。 1. 前序遍历 先输出,再将左子节点入栈。没有左子节点了,才考虑右子节点的入栈。 1234567891011121314vector<int> preorderTraversal(TreeNode* root) { vector<int> ans; stack<TreeNode*> stk; while(!stk.empty() || root!=nullptr){ while(root!=nullptr){ ans.push_back(root->val); stk.emplace(root); root=root->left; ...