陕西交通建设集团蓝商分公司网站,wordpress 手机看不了视频,顾问,做网站细节本文涉及的基础知识点
C单调栈
LeetCode907. 子数组的最小值之和
给定一个整数数组 arr#xff0c;找到 min(b) 的总和#xff0c;其中 b 的范围为 arr 的每个#xff08;连续#xff09;子数组。 由于答案可能很大#xff0c;因此 返回答案模 109 7 。 示例 1#x…本文涉及的基础知识点
C单调栈
LeetCode907. 子数组的最小值之和
给定一个整数数组 arr找到 min(b) 的总和其中 b 的范围为 arr 的每个连续子数组。 由于答案可能很大因此 返回答案模 109 7 。 示例 1 输入arr [3,1,2,4] 输出17 解释 子数组为 [3][1][2][4][3,1][1,2][2,4][3,1,2][1,2,4][3,1,2,4]。 最小值为 3124112111和为 17。 示例 2 输入arr [11,81,94,43,3] 输出444 提示 1 arr.length 3 * 104 1 arr[i] 3 * 104
单调栈
枚举子数组的最小元素a[i]令a[i1…i2]包括a[i]且a[i]是其的最小元素即 i1 x i 则a[x]大于a[i];i x i2则a[x] a[i]。 令最小i1是i3最大i2是i4。则a[i]是其最小元素的子数组数量为f(i)(i-i31) × \times ×(i4-i1。结果是 ∑ \sum ∑f(i) 如何求a[0…i-1]中小于等于a[i]的元素中下标最大的 i5 i6且a[i5] a[i6]则i5 永远不会被选中。即i5被i6淘汰了。淘汰后值升序。淘汰后栈顶元素小于等于a[i]的最大下标)1就是i3,如果是空栈则为-1。 i5被i6淘汰说明说明i6是a[i6] a[i5]中下标最小的。即i6就是i5的i41.如果i5没被淘汰则i41是n。
代码
核心代码
templateint MOD 1000000007
class C1097Int
{
public:C1097Int(long long llData 0) :m_iData(llData% MOD){}C1097Int operator(const C1097Int o)const{return C1097Int(((long long)m_iData o.m_iData) % MOD);}C1097Int operator(const C1097Int o){m_iData ((long long)m_iData o.m_iData) % MOD;return *this;}C1097Int operator-(const C1097Int o){m_iData (m_iData MOD - o.m_iData) % MOD;return *this;}C1097Int operator-(const C1097Int o){return C1097Int((m_iData MOD - o.m_iData) % MOD);}C1097Int operator*(const C1097Int o)const{return((long long)m_iData * o.m_iData) % MOD;}C1097Int operator*(const C1097Int o){m_iData ((long long)m_iData * o.m_iData) % MOD;return *this;}C1097Int operator/(const C1097Int o)const{return *this * o.PowNegative1();}C1097Int operator/(const C1097Int o){*this / o.PowNegative1();return *this;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}C1097Int pow(long long n)const{C1097Int iRet 1, iCur *this;while (n){if (n 1){iRet * iCur;}iCur * iCur;n 1;}return iRet;}C1097Int PowNegative1()const{return pow(MOD - 2);}int ToInt()const{return m_iData;}
private:int m_iData 0;;
};class Solution {public:int sumSubarrayMins(vectorint arr) {const int N arr.size(); stackint sta;vectorint i3s(N, -1), i4s(N, N);for (int i 0; i arr.size(); i) {while (sta.size() (arr[sta.top()] arr[i])) {i4s[sta.top()] i;sta.pop(); }if (sta.size()) { i3s[i] sta.top(); }sta.emplace(i);}C1097Int res;for (int i 0; i N; i) {res C1097Int(i-i3s[i]) *( i4s[i]-i)*arr[i];}return res.ToInt();}};单元测试 vectorint arr;TEST_METHOD(TestMethod1){arr { 3 };auto res Solution().sumSubarrayMins(arr);AssertEx(3, res);}TEST_METHOD(TestMethod2){arr { 3,3 };auto res Solution().sumSubarrayMins(arr);AssertEx(9, res);}TEST_METHOD(TestMethod3){arr { 3,1 };auto res Solution().sumSubarrayMins(arr);AssertEx(5, res);}TEST_METHOD(TestMethod11){arr { 3,1,2,4 };auto res Solution().sumSubarrayMins(arr);AssertEx(17, res);}TEST_METHOD(TestMethod12){arr { 11,81,94,43,3 };auto res Solution().sumSubarrayMins(arr);AssertEx(444, res);}扩展阅读
我想对大家说的话工作中遇到的问题可以按类别查阅鄙人的算法文章请点击《算法与数据汇总》。学习算法按章节学习《喜缺全书算法册》大量的题目和测试用例打包下载。重视操作有效学习明确的目标 及时的反馈 拉伸区难度合适 专注闻缺陷则喜(喜缺)是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛失败反思成功 成功反思成功
视频课程
先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771 如何你想快速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用**C**实现。