网站服务器系统盘满了怎么清理,住房和城乡建设部网站焊工查询,个人求职网站履历怎么做,学做炒菜的网站作者推荐
map|动态规划|单调栈|LeetCode975:奇偶跳
通过枚举最小#xff08;最大#xff09;值不重复、不遗漏枚举所有子数组
C算法#xff1a;美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right#xff0c;[left,right]直接的高度都是maxHeight[i] 可以…作者推荐
map|动态规划|单调栈|LeetCode975:奇偶跳
通过枚举最小最大值不重复、不遗漏枚举所有子数组
C算法美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right[left,right]直接的高度都是maxHeight[i] 可以用封装的类可以理解为枚举山顶这个子数组【单调栈]LeetCode84: 柱状图中最大的矩形【单调栈】【区间合并】LeetCode85:最大矩形【单调栈】LeetCode2334:元素值大于变化阈值的子数组【单调栈】LeetCode:2818操作使得分最大【前缀和】【单调栈】LeetCode2281:巫师的总力量和map 动态规划 单调栈 LeetCode975:奇偶跳
封装类
class CRangIndex
{
public:templateclass _PrCRangIndex(int iVectorSize, _Pr CurIndexCmpStackTopIndex){m_c iVectorSize;m_vLeft.assign(m_c, -1);m_vRight.assign(m_c, m_c);stackint sta;for (int i 0; i m_c; i){while (sta.size() (CurIndexCmpStackTopIndex(i, sta.top()))){m_vRight[sta.top()] i;sta.pop();}if (sta.size()){m_vLeft[i] sta.top();}sta.emplace(i);}}templateclass _PrCRangIndex(const vectorint nums, _Pr CurValueCmpStackTopValue){m_c nums.size();m_vLeft.assign(m_c, -1);m_vRight.assign(m_c, m_c);stackint sta;for (int i 0; i m_c; i){while (sta.size() (CurValueCmpStackTopValue(nums[i], nums[sta.top()]))){m_vRight[sta.top()] i;sta.pop();}if (sta.size()){m_vLeft[i] sta.top();}sta.emplace(i);}}int m_c;vectorint m_vLeft, m_vRight;//vLeft[i] 从右向左第一个小于nums[i] ;vRight[i] 是第一个小于等于nums[i]。
};测试用例
大于
CRangIndex ri(nums, std::greater()); 结果右边界从左向右第一个大于当前值左边界从右向左第一个大于等于当前值
原数组左边界右边界1 2 3 3 4-1 -1 -1 2 -11 2 4 4 58 7 3 4-1 0 1 14 4 3 4
大于等于
CRangIndex ri(nums, std::greater_equal()); 结果右边界从左向右第一个大于等于当前值左边界从右向左第一个大于当前值 .|原数组 | 左边界 | 右边界| |–|–|–| 1 2 3 3 4|-1 -1 -1 -1 -1|1 2 3 4 5 8 7 3 4| -1 0 1 1|4 4 3 4
小于
CRangIndex ri(nums, std::less()); 结果右边界从左向右第一个小于当前值左边界从右向左第一个小于等于当前值 .|原数组 | 左边界 | 右边界| |–|–|–| 1 2 3 3 4|-1 0 1 2 3|5 5 5 5 5 8 7 3 4 |-1 -1 -1 2|1 2 4 4
小于等于
CRangIndex ri(nums, std::less_equal()); 结果右边界从左向右第一个小于等于当前值左边界从右向左第一个小于当前值 .|原数组 | 左边界 | 右边界| 1 2 3 3 4|-1 0 1 1 3|5 5 3 5 5 8 7 3 4| -1 -1 -1 2|1 2 4 4
int main()
{vectorint nums;{nums { 1,2,3,3,4 };CRangIndex ri(nums, std::less_equal());std::cout 数组值;CConsole::Out(nums);std::cout 左边界;CConsole::Out(ri.m_vLeft);std::cout 左边界;CConsole::Out(ri.m_vRight);}{nums { 8,7,3,4 };CRangIndex ri(nums, std::less_equal());std::cout 数组值;CConsole::Out(nums);std::cout 左边界;CConsole::Out(ri.m_vLeft);std::cout 左边界;CConsole::Out(ri.m_vRight);}
}二分查找的进一步优化
子状态都单调递增或单调递减一插入也是有序直接栈顶插入。二淘汰无效状态后直接栈顶插入。二要查询的值是被淘汰的元素。二要查询的值是栈顶元素。
【单调栈】LeetCode1776:车队 【单调栈】LeetCode:1944队列中可以看到的人数
最小最大字典序
【单调栈 】LeetCode321:拼接最大数 【单调栈】LeetCode2030:含特定字母的最小子序列
其它
【单调栈】【二分查找】LeetCode: 2454.下一个更大元素 IV【map】【单调栈 】LeetCode768: 最多能完成排序的块 II 扩展阅读
视频课程
有效学习明确的目标 及时的反馈 拉伸区难度合适可以先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法请下载《喜缺全书算法册》doc版 https://download.csdn.net/download/he_zhidan/88348653
我想对大家说的话闻缺陷则喜是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用C 实现。