题目:给定一个正整数数组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;}}}
扫描二维码
获取更多精彩
金科优源汇


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