蓝桥杯省赛无忧 编程12 四元组问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
bool FoursNumberFind(vector<int>& nums) {
    stack<int> st;
    int n = nums.size(), k = INT_MIN, INF = INT_MAX;
    //min_r[i] = min(nums[r]), i < r < n。
    //表示第i个数(不包括第i个数)右边的最小值
    vector<int> min_r(n, INF);
    // 用前缀和方法求 min_r 数组
    for (int i = n - 2; i >= 0; --i) {
        min_r[i] = min(min_r[i + 1], nums[i + 1]);
    }
    //用单调栈求下标位 nums[c] < nums[a] < nums[b] 的情况
    for(int i = 0; i < n; ++i){
        // 下标 i 即为 c ,k 即为 nums[a]
        if(nums[i] < k)  { //如果存在  nums[c] < nums[a] < nums[b] 的情况
            //判断 c 的右边是否 有比 nums[c] 小的数, 有则表示存在下标 d ,返回true
            if(nums[i] > min_r[i]) return true;
        }
        // 如果栈不为空并且栈顶元素小于当前访问的元素
        while(!st.empty() && st.top() < nums[i]) {
            //需要找满足小于nums[b]的最大 k 值
            k = max(k,st.top());
            st.pop();
        }
        //压入栈顶,即为更新 nums[b]
        st.push(nums[i]);
    }
    return false;
}
int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
    }
    if (FoursNumberFind(nums)) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}

代码实现了检测一个数组中是否存在特定的索引模式,即 a < b < c < dnums[d] < nums[c] < nums[a] < nums[b]
代码分析:

  1. 函数 FoursNumberFind 接收一个整数数组 nums 作为参数,并试图找出是否存在上述模式。如果找到,函数返回 true,否则返回 false

  2. 首先,定义一个栈 st 来帮助我们跟踪可能的 nums[c] 值,并将整数 k 初始化为 INT_MIN 来表示我们尚未找到一个有效的 nums[a]。同时,创建一个向量 min_r,用于存放从当前位置起右侧的最小值。

  3. 接着,使用一个前向遍历循环来填充 min_r 数组,记录数组中每个元素右边的最小值。

  4. 再使用一个循环从左到右遍历 nums

    • 判断当前元素是否小于 k,即判断是否 nums[c] < nums[a]。如果是,并且当前元素也大于它右侧的最小值,这意味着存在一个 nums[d],因此返回 true

    • 使用一个while循环和栈来维护和更新可能的 nums[b] 值。如果栈非空并且栈顶的值小于当前元素,那么说明找到了一个新的 nums[b](当前元素),于是更新 k(作为 nums[a])为栈顶的值,并从栈中弹出这个栈顶元素。

    • 将当前元素压入栈中,代表一个新的候选的 nums[b]

  5. 如果上述循环结束后没有找到满足条件的下标组合,函数返回 false

  6. main 函数中,程序读取用户输入的数组长度 n 和数组元素,然后调用 FoursNumberFind 函数来确定是否存在所描述的模式。根据函数返回的布尔值,程序输出 YESNO

代码使用了一个单调栈来优化搜索过程,并避免了暴力枚举的 O(n^4) 复杂度,使得算法的性能得到了显著的提升。标准输入和输出流(cincout)用于接收输入和输出结果,提供了与用户交互的接口。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年电工(初级)证考试题库及电工(初级)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年电工&#xff08;初级&#xff09;证考试题库及电工&#xff08;初级&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#…

k8s---安全机制

k8s的安全机制&#xff0c;分布式集群管理工具&#xff0c;就是容器编排。安全机制的核心&#xff1a;APIserver。为整个集群内部通信的中介&#xff0c;也是外控控制的入口。所有的机制都是围绕apiserver来进行设计&#xff1a; 请求api资源&#xff1a; 1、认证 2、鉴权 …

陈酿过程中的物质转化与品质改善

陈酿是酿酒过程中至关重要的环节&#xff0c;它能够改善酒的品质和口感&#xff0c;使酒更加醇厚、芳香。云仓酒庄的豪迈白酒在陈酿过程中&#xff0c;物质转化与品质改善方面表现得尤为杰出。 首先&#xff0c;陈酿能够促进酒中物质的转化。在长时间的陈酿过程中&#xff0c;酒…

遇到IP禁令怎么办?别慌,解决方法在这

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

Docker容器引擎(3)

目录 一.Docker 镜像的创建 1&#xff0e;基于现有镜像创建 2&#xff0e;基于本地模板创建 3.基于Dockerfile创建&#xff1a; Dockerfile 操作常用的指令&#xff1a; ADD 和 COPY 的区别&#xff1f; CMD 和 ENTRYPOINT 的区别&#xff1f; 容器启动命令的优先级 如…

c++day2

计算矩形的面积 #include <iostream> using namespace std; class Rect {int width;int heigh; public:void init(int w, int h){width w;heigh h;}void set_w(int w){width w;}void set_h(int h){heigh h;}void show(){cout << "该矩形面积:" <…

ASP.NET Core NE8实现HTTP Upgrade和HTTP CONNECT代理服务器

看到一个文章[Go] 不到 100 行代码实现一个支持 CONNECT 动词的 HTTP 服务器 在NET8中如何实现 创建项目为MiniApi 编辑Program.cs文件。 var builder WebApplication.CreateSlimBuilder(args);var app builder.Build();// 将HTTP请求通过协议升级机制转为远程TCP请求&…

可视化智慧水电站EasyCVR视频智能监控系统方案设计与技术应用介绍

一、背景需求 水电站作为国家重要的能源基地&#xff0c;其安全运行对于保障能源供应和社会稳定具有重要意义。然而&#xff0c;传统的人工监控方式存在着诸多问题&#xff0c;如人力成本高、监控范围有限、反应不及时等。因此&#xff0c;水电站急需引进一种先进的视频智能监…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着 组件…

解读Android进程优先级ADJ算法

本文基于原生Android 9.0源码来解读进程优先级原理,基于篇幅考虑会精炼部分代码 一、概述 1.1 进程 Android框架对进程创建与管理进行了封装,对于APP开发者只需知道Android四大组件的使用。当Activity, Service, ContentProvider, BroadcastReceiver任一组件启动时,当其所…

[极客大挑战 2019]Upload1

直接上传php一句话木马&#xff0c;提示要上传image 把文件名改成gif并加上gif文件头后&#xff0c;绕过了对image类型的检测&#xff0c;但是提示文件内含有<?&#xff0c;且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…

使用 LinkAi 打造自己的知识库和数字人

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、LinkAi 介绍 二、文档库 2.1 创建知识库 2.2 配置知识库 2.3 Ai配置 2.4 导入文档 2.5 接入微信 三、扩展 四、总结…

华媒舍:15种媒体发稿推广的创意理念与案例分析

媒体发稿已经成为推广知名品牌、产品与服务关键方式之一。怎样通过媒体发稿提升曝光度和吸引住受众却是一个挑战。下面我们就详细介绍15种创意理念和案例分析&#xff0c;帮助你更好地进行新闻媒体发稿推广。 1.造就日常生活小故事通过展示真实用户故事和感受&#xff0c;读者对…

Elasticsearch内核解析 - 写入篇

Elasticsearch内核解析 - 写入篇 - 知乎 目前的Elasticsearch有两个明显的身份,一个是分布式搜索系统,另一个是分布式NoSQL数据库,对于这两种不同的身份,读写语义基本类似,但也有一点差异。 写操作 实时性: 搜索系统的Index一般都是NRT(Near Real Time),近实时的,比…

vue3项目中用codemirror实现格式化java代码及不太成熟的历程

本期只介绍创作的曲折历程&#xff0c;并不能解决实际问题&#xff0c;现有插件不支持&#xff0c;总结在了最后 一、案例效果 vue3项目使用preitter 搭配prettier-plugin-java 实现codemirror 格式化 java 二、步骤 1. 安装prettier和prettier-plugin-java&#xff0c;可以…

Tomcat好帮手---JDK

目录 1、Tomcat好帮手---JDK 2、安装JDK 部署Tomcat参考博主博客 部署TOMCAT详解-CSDN博客 1、Tomcat好帮手---JDK JDK是 Java 语言的软件开发工具包&#xff0c;JDK是整个java开发的核心&#xff0c;它包含了JAVA的运行环境&#xff08;JVMJava系统类库&#xff09;和JAVA…

计算机网络 第5章(运输层)

系列文章目录 计算机网络 第1章&#xff08;概述&#xff09; 计算机网络 第2章&#xff08;物理层&#xff09; 计算机网络 第3章&#xff08;数据链路层&#xff09; 计算机网络 第4章&#xff08;网络层&#xff09; 计算机网络 第5章&#xff08;运输层&#xff09; 计算机…

基于vue实现计数器案例

一、需求 页面显示两个按钮&#xff0c;分别为&#xff1a;增加 和 减少&#xff1b;显示加减后的数字&#xff1b;加到10提示不能再加&#xff0c;减到0提示不能再减&#xff1b; 二、代码演示 1、实现步骤 data中定义数据: 比如 num 值为1methods中添加两个方法: 比如add…

技术标准引领文物预防性保护新篇章(文物预防保护,技术标准)

文物做为历史的见证和传承&#xff0c;背负着中华文化久远的文化与智慧。但是&#xff0c;随着时间推移&#xff0c;这类珍贵的文化遗产不可避免面临各种自然和人为伤害。为了保障这类珍贵的不可再生资源&#xff0c;文物预防性保护领域标准规范发展和应用至关重要。 一、现状…

蓝桥杯准备之路-Java基础复习

一、基本数据类型 int(32),long(64),float,double,boolean ,char 溢出判断&#xff1a; System.out.println("蓝桥杯练习第一天");Scanner scan new Scanner(System.in);int a scan.nextInt();System.out.println(a);int a1 Integer.MAX_VALUE;System.out.prin…