[Algorithm][综合训练][栈和排序][加减]详细讲解

2024-09-04 06:44

本文主要是介绍[Algorithm][综合训练][栈和排序][加减]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.栈和排序
    • 1.题目链接
    • 2.算法原理详解 && 代码实现
  • 2.加减
    • 1.题目链接
    • 2.算法原理详解 && 代码实现


1.栈和排序

1.题目链接

  • 栈和排序

2.算法原理详解 && 代码实现

  • 解法:栈 + 贪心 -> 每次尽可能先让当前需要的最大值弹出去
    vector<int> solve(vector<int>& a) 
    {int n = a.size();vector<bool> hash(n + 1, false);vector<int> ret;int aim = n;stack<int> st;for(auto& x : a){st.push(x);hash[x] = true;// 先更新目标值while(hash[aim]){aim--;}// 出栈while(st.size() && st.top() >= aim){ret.push_back(st.top());st.pop();}}return ret;
    }
    

2.加减

1.题目链接

  • 加减

2.算法原理详解 && 代码实现

  • 解法:枚举 + 前缀和 + 滑动窗口 + 贪心
    • 贪心:尽可能选择一些挨得比较近的数,让他们变成相同的数

      • 排序
    • 枚举:枚举所有的区间,找出区间内所有数变成相同的数的最小代价(cost <= k)的最大区间

    • 如何求一个区间的最小代价cost?

      • 数学问题:数轴上有一些点,选取一个位置,使所有点到它的距离之和最小
      • 结论:选择最中间的点 -> 奇数点时就是中间,偶数点时,中间的两个随意哪个都可以
    • 优化一:前缀和优化求最小代价cost
      请添加图片描述

    • 优化二:滑动窗口优化枚举所有区间

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;vector<long long> nums, sum;long long Cal(int l, int r)
    {int mid = (l + r) / 2;return (mid - l - r + mid) * nums[mid] - (sum[mid - 1] - sum[l - 1]) + (sum[r] - sum[mid]);
    }int main()
    {long long n = 0, k = 0;cin >> n >> k;nums.resize(n + 1, 0);sum.resize(n + 1, 0);for(int i = 1; i <= n; i++){cin >> nums[i];}sort(nums.begin() + 1, nums.end());// 初始化前缀和数组for(int i = 1; i <= n; i++){sum[i] = sum[i - 1] + nums[i];}int left = 1, right = 1, ret = 1;while(right <= n){long long cost = Cal(left, right);while(cost > k){left++;cost = Cal(left, right);}ret = max(ret, right - left + 1);right++;}cout << ret << endl;return 0;
    }
    

这篇关于[Algorithm][综合训练][栈和排序][加减]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135292

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam