算法题——操作数组

|▌冷眼眸甩不掉的悲伤 提交于 2020-12-04 23:54:27

题目:给定一个正整数数组A,长度为n,下标范围是[0..n - 1]。给定非负整数数组,query[]代表操作。如果query[i] = x,表示第i次操作把A数组中A[x]右边小于它的元素设置为0。即

for (int j  = x + 1; j < n; ++j) {  if (A[j] < A[x]) {    A[j] = 0;  }}

问按顺序执行所有query数组的操作后,A数组最终包含的值?

例如A[] = {4, 3, 4, 3, 2}, query[] = {2, 1}时

第一次操作后,A[] = {4, 3, 4, 3, 0}

第二次操作后,A[] = {4, 3, 4, 0, 0}。


分析:仔细想象,其实操作顺序不重要,即任意两个操作都可以交换顺序(为什么?)。所以我们简单地从左到右操作,并且记录下之前A值的最大值m即可。如果当前A[i]小于m,则A[i]最终会变为0。


注意,我们并不知道query数组是否包含没有意义的重复值,这里需要小心处理(或者简单地加入set。)


代码:


void solution(vector<int> &A, vector<int> &query) {   sort(query.begin(), query.end());   for (int i = 0, m = 0, j = 0; i < A.size(); ++i) {       for (;j < query.size() && query[j] < i;++j)       ;       for (;j < query.size() && query[j] == i;++j) {           m = max(m, A[i]);       }       if (A[i] < m) {           A[i] = 0;       }   }}




精彩推荐

基于容器的selenium爬虫实战:手把手教你采集ai模型训练数据

Vintage Analysis 数据分析模型的前生、今世和未来

敏捷中国十八年目睹之怪现状(上篇)

朋友被阿里面试官灵魂拷问,跑来求救。。。



扫描二维码

获取更多精彩

金科优源汇



本文分享自微信公众号 - 金科优源汇(jkyyh2020)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!