算法竞赛入门经典训练指南——例18 max(a[i]-a[j])且(i<j)

本文介绍了一道算法竞赛题目,要求在给定的数组中找到最大差值a[i]-a[j](i<j)。由于数据量大,普通的双层循环方法效率低下。文章提出转换思路,维护前缀最大值maxi,遍历一次数组即可得到答案,实现O(n)的时间复杂度解决方案。
摘要由CSDN通过智能技术生成

题意:如标题所示,给一个数组让你输出a[i]-a[j]的最大值,
其中i < j表示a[i]在a[j]前面。
思路:常规解法就是通过两层for循环找每一次a[i]和i后面的a[j]之间的差值,最后输出即可。但是数据量在1万以上,所以O(n^2)的时间复杂度是不够的。
此时就要进行思维的转化:其实我们要求的就是j之前最大的ai,这样用maxi和当前的a[j]做差就是当前的答案了。扫的过程中不断更新最大差值和当前maxi的值,所以扫一遍就得出结果。
代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
int a[10010],n,ans,maxi;
inline int maxer(int a,int b){
  return a>b?a:b;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值