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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择适合的开源框架来构建微服务架构?

随着科技的飞速发展&#xff0c;云计算和大规模应用的需求日益显著&#xff0c;这促使微服务架构在软件开发领域中占据了主流地位。微服务架构的广泛应用为开发人员提供了灵活性、可伸缩性和高可用性&#xff0c;从而推动了快速的应用程序开发。然而&#xff0c;在构建微服务架…

NextJS开发:nextjs中使用CkEditor5

NextJS项目中需要使用CkEditor5作为富文本编辑器&#xff0c;按照官网React CkEditor5手册使用出现如下错误&#xff1a; node_modules/ckeditor/ckeditor5-react/dist/index.js (5:242) eval⨯ ReferenceError: self is not defined还是因为nextjs的服务器端渲染造成的错误&…

快速幂(c++,超级详细)

快速幂 如果我们打算求a^b, 我们可能会写一个for循环&#xff0c;乘以b次a&#xff0c;时间复杂度为O(b) 当b比较小的时候还可以运用&#xff0c;但是当b很大&#xff0c;比如b1000000,此时时间复杂度就显然很高了&#xff0c;我们需要对其进行优化 ———快速幂 开始之前&a…

JDBC快速入门

JDBC快速入门 PS&#xff1a;上传图片有点问题&#xff0c;我整理成了PDF格式&#xff0c;方便看图文。 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库…

【ARM AMBA AXI 入门 14 -- AXI 窄位传输 | 非对齐传输| 大小端传输】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 窄位传输 (Narrow Transfer)非对齐传输 (Unaligned Transfer)大小端传输 (Endianness Transfer)ARM AMBA AXI (Advanced eXtensible Interface) 是一个高性能、高带宽的总线接口,常用于连接高速微处理器核心与其它部件。在…

模拟电路总结

一、半导体器件 1.1 半导体的特性 导电性能介于导体和绝缘体之间。如&#xff1a;硅&#xff08;Si&#xff09;、锗&#xff08;Ge&#xff09; 1.1.1 本征半导体 纯净的、不含杂质的半导体 温度敏感&#xff1a;T0K时&#xff0c;绝缘&#xff1b;温度升高时&#xff0c;载流…

Thinkphp-商城项目之oss文件上传及web端直传

4.3头像上传 一般商城网站都会把文件上传到第三方云&#xff0c;例如阿里云(oss)&#xff0c;腾讯云(cos)&#xff0c;当然如果公司有足够的实力&#xff0c;可以自己部署一台文件服务器&#xff0c;用于文件的保存。 头像上传一般是用户在用户中心上传的&#xff0c;后台管理…

软件需求的三大层次,逐层细化的注意事项

需求逐层分解和转化是一个持续优化的过程&#xff0c;在这个过程中&#xff0c;我们需要明确软件需求的三大层次&#xff0c;从而帮助项目团队理解组织或客户的高层目标和期望&#xff0c;满足用户的期望和需求&#xff0c;有助于产品的系统设计和开发。 一、软件需求三大层次 …

【力扣的101夜】轮转数组

public void rotate(int[] nums, int k) { } 用 Syst.arraycopy 五个参数是 System.arraycopy(nums, length - step, temp, 0, step); nums&#xff1a;源数组&#xff0c;即要从中复制元素的数组。length - step&#xff1a;源数组的起始位置&#xff0c;即从哪个索引开始复…

坑惨啦!!!——符号冲突案例分析

背景 前段时间在北汽项目中&#xff0c;遇到了一个奇怪现象&#xff1a;程序启动之后&#xff0c;偶现运行一段时间后&#xff0c;crash&#xff0c;复现频率较高。困扰了大家较长时间。最终在和同事的不懈努力下&#xff0c;找到的根因&#xff0c;并找到了解决方法。过程中也…

影视行业如何远程完整快速传输大文件?

影视行业是一个充满创意和协作的领域。在影视制作中&#xff0c;涉及到多个环节和部门&#xff0c;包括编剧、导演、摄影、剪辑、配音、视效等。这些环节和部门通常分布在不同的地点&#xff0c;甚至不同的国家。因此&#xff0c;影视制作过程中需要频繁进行远程传输&#xff0…

前后端-记录

目录 ApiRESTful API Api api Application Programming Interface 应用程式界面 RESTful API rest Representational State Transfer 表现层状态转移&#xff0c;属于设计风格&#xff0c;不是强制标准 满足rest的 restful

科技赋能,创新发展!英码科技受邀参加2023中国创新创业成果交易会

11月17日至19日&#xff0c;2023中国创新创业成果交易会&#xff08;简称&#xff1a;创交会&#xff09;在广州市广交会展馆圆满举行。英码科技受邀参加本届创交会&#xff0c;并在会场展示了创新性的AIoT产品、深元AI引擎和行业热门解决方案。 据介绍&#xff0c;本届创交会由…

vscode编写verilog的插件【对齐、自动生成testbench文件】

vscode编写verilog的插件&#xff1a; 插件名称&#xff1a;verilog_testbench,用于自动生成激励文件 安装教程&#xff1a;基于VS Code的Testbench文件自动生成方法——基于VS Code的Verilog编写环境搭建SP_哔哩哔哩_bilibili 优化的方法&#xff1a;https://blog.csdn.net…

CMake 判断操作系统类型

上回的CMakeLists.txt里面有一句,if (WIN32)......endif(WIN32); 根据资料,这是判断操作系统是否是Windows; 下面单独看一下; 一个CMakeLists.txt文件如下; if(WIN32)# 如果是 Windowsmessage("当前操作系统为 Windows") elseif(UNIX AND NOT APPLE)# 如果…

c# socknet编程

c#服务端 using System.Text; using System.Net.Sockets; using System.Net;class proj {internal static void Main(string[] args){string ip "";int port 5000;byte[] buffernew byte[1024*1024*2];Socket socket null;//1 实例化套接字&#xff08;ipv4寻址协…

Go 语言学习:了解 const 关键字及常量声明

如果一个变量应该有一个固定的、不能改变的值&#xff0c;你可以使用const关键字。 const关键字将变量声明为"常量"&#xff0c;这意味着它是不可改变和只读的。 语法 const CONSTNAME type value 声明常量 声明常量的示例&#xff1a; package main import (…

【MATLAB基础绘图第17棒】绘制玫瑰图

MATLAB绘制玫瑰图 玫瑰图&#xff08;Nightingale Rose Chart&#xff09;风玫瑰图&#xff08;WindRose&#xff09;准备工作&#xff1a;WindRose工具包下载案例案例1&#xff1a;基础绘图 参考 玫瑰图&#xff08;Nightingale Rose Chart&#xff09; 玫瑰图&#xff08;Ni…

Vue2系列 — $listeners 多层嵌套组件通信

涉及爷爷组件和孙组件通信&#xff0c;孙组件可以 emit 数据到父组件&#xff0c;父组件再 emit 数据到爷爷组件&#xff0c;实现组件通信&#xff0c;但是比较繁琐 使用 $listeners 可以实现孙组件的数据直接传递到爷组件中去 官网原文&#xff1a;https://v2.cn.vuejs.org/…

Java_异常详解

前言 异常是什么,异常如何抛出,如何抛出自定义异常,异常处理主要的五个关键字&#xff1a;throw,try,catch,finally,throws ,异常的处理流程 异常是什么 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1. 算数异…