当前位置: 首页 > news >正文

C++单调向量算法:132 模式解法三枚举1

本题不同解法

包括题目及代码C++二分查找算法:132 模式解法一枚举3
C++二分查找算法:132 模式解法二枚举2
代码最简洁C++二分查找算法:132 模式解法三枚举1
性能最佳C++单调向量算法:132 模式解法三枚举1

分析

时间复杂度

2轮循环时间复杂度都是O(n)。

步骤

第一步

枚举32,再将2to3,转成3to2。枚举2。v3ValueIndex|记录nums[0,k)所有的值的索引。然后在v3ValueIndex中寻找值大于iValue,如果有多个结果取索引最大的。如果value0 <= value1且index0 <= index1,则value0被index0淘汰。能选取vaule0则必定能选择vaule1,而index1比index0大。淘汰后,值按降序排序,3Index按升序排序。由于索引是越来越大,所以只会淘汰旧值,不会被旧值淘汰。由于淘汰值小的,所以可以从末尾淘汰。按索引升序插入,而索引是按升序排序的,所以插入也在末尾。故可以用栈或向量代替有序映射。在尾部增加、删除时间复杂度都是O(1)。

第二步

枚举1。如果m3IndexTo2Value(i,m_c)中存在比nums[i]大的值,则存在132模式,否则不存在。注意:m3IndexTo2Value 有些key会不存在。std::unordered_map不存在的值是0,而本题的值可能是负数。

关于2to3转成3to2

计算2to3的过程中,会淘汰一些组合,不影响结果。2to3转成3to2的时候,也会淘汰一些组合,被淘汰的不影响最终结果。m3IndexTo2Value, 3Index相同,淘汰值小的。如果值小的都大于nums[i],那么值的一定大于nums[i]。我们只要确保没被淘汰的组合都被枚举到,旧可以了。

代码

核心代码

class Solution {
public:bool find132pattern(vector<int>& nums) {m_c = nums.size();const int iNotMayMinValue = -1000 * 1000 * 1000 - 1;{vector < std::pair<int, int>> v3ValueIndex;//3Value的值按降序排序,3Index按升序排序for (int k =0 ; k < m_c ; k++ ){const int& iValue = nums[k];while (v3ValueIndex.size() && (v3ValueIndex.back().first <= iValue)){v3ValueIndex.pop_back();}if (v3ValueIndex.size()){const int i3Index = v3ValueIndex.back().second;if (!m3IndexTo2Value.count(i3Index) || (m3IndexTo2Value[i3Index] < iValue)){m3IndexTo2Value[i3Index] = iValue;}}v3ValueIndex.emplace_back(iValue, k);}}//寻找1,即nums[i]{int iMaxTow = iNotMayMinValue;for (int i = m_c - 1; i >= 0; i--){const int& iValue = nums[i];if( iMaxTow > iValue ){m_iIndex1 = i;return true;}if (m3IndexTo2Value.count(i)){iMaxTow = max(iMaxTow, m3IndexTo2Value[i]);}}}return false;}std::unordered_map<int, int> m3IndexTo2Value;int m_iIndex1 = -1;int m_c;
};

测试代码

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
Assert(v1[i], v2[i]);
}
}

int main()
{
vector nums;
bool res;
{
Solution slu;
nums = { 3,5,0,3,4 };
res = slu.find132pattern(nums);
//Assert(vector{5, 0, 5, 2, 0}, slu.m_v3To1);
Assert(0, slu.m_iIndex1);
Assert(true, res);
}
{
nums = { 1 ,2, 3,4 };
res = Solution().find132pattern(nums);
Assert(false, res);
}
{
Solution slu;
nums = { 3,1,4,2 };
res = slu.find132pattern(nums);
//Assert(vector{4, 4, 0, 1}, slu.m_v3To1);
Assert(1, slu.m_iIndex1);
Assert(true, res);
}
{
Solution slu;
nums = { -1,3,2,0 };
res = slu.find132pattern(nums);
//Assert(vector{4, 0, 0, 0}, slu.m_v3To1);
Assert(0, slu.m_iIndex1);
Assert(true, res);
}
{
Solution slu;
nums = { 1, 0, 1, -4, -3 };
res = slu.find132pattern(nums);
//Assert(vector{4, 0, 0, 0}, slu.m_v3To1);
Assert(-1, slu.m_iIndex1);
Assert(false, res);
}

//CConsole::Out(res);

}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步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 C++17
或者 操作系统:win10 开发环境: VS2022 C++17

相关文章:

  • 【每日一题】—— C. Yarik and Array(Codeforces Round 909 (Div. 3))(贪心)
  • 【具身智能评估1】具身视觉语言规划(EVLP)仿真环境汇总
  • Vulkan渲染引擎开发教程 一、开发环境搭建
  • python基础练习题库实验3
  • Canal+Kafka实现MySQL与Redis数据同步(一)
  • 贪吃蛇小游戏
  • typora使用PicGo自动上传图片到chevereto图床
  • Docker简介
  • 选硬币该用动态规划
  • 【漏洞复现】泛微e-Weaver SQL注入
  • ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么
  • zookeperkafka学习
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • Linux操作系统使用及C高级编程-D5Linux shell命令(进程管理、用户管理)
  • 黑马React18: 基础Part 1
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • avalon2.2的VM生成过程
  • C++11: atomic 头文件
  • const let
  • download使用浅析
  • dva中组件的懒加载
  • HTTP 简介
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • LeetCode18.四数之和 JavaScript
  • leetcode讲解--894. All Possible Full Binary Trees
  • 简析gRPC client 连接管理
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 批量截取pdf文件
  • 一、python与pycharm的安装
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #Linux(权限管理)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (pojstep1.1.2)2654(直叙式模拟)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (一)认识微服务
  • (转)程序员疫苗:代码注入
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net 7 上传文件踩坑
  • .Net 8.0 新的变化
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net的C#语言取月份数值对应的MonthName值
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @Transient注解
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ai笔记4] 将AI工具场景化,应用于生活和工作