[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

相关文章

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择