文章目录
- 1. 题目
- 2. 解题
1. 题目
链接:https://ac.nowcoder.com/acm/contest/10166/B
来源:牛客网
操场上有n个人排成一队,这n个人身高互不相同,可将他们的身高视为一个1到n的排列。
这时需要把队伍变成升序,也就是从矮到高排序。
每次可以选择一个人,让这个人和在他身后的人比高矮,如果比对方高,则交换位置并继续下一次比较,直到比对方矮或者已经在队尾。
现在给出数n和一个1到n的排列,求最少的选择次数,使队伍变为升序。
示例1
输入
4,[4,1,2,3]
返回值
1备注:
n<=10^6
数据包含一个整数n和一个含有n个元素的数组,表示从队头到队尾的人的身高。
输出一个整数表示答案。
2. 解题
- 单调栈,当栈顶的身高 比 当前的大 ,需要移动一次
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* * @param n int整型 * @param a int整型vector * @return int整型*/int wwork(int n, vector<int>& a) {// write code hereint ans = 0;stack<int> s;for(int i = 0; i < n; i++){while(!s.empty() && s.top() > a[i]){ans++;s.pop();}s.push(a[i]);}return ans;}
};
- 直接反向遍历,当前身高比后面最小的大,就需要移动一次
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可* * @param n int整型 * @param a int整型vector * @return int整型*/int wwork(int n, vector<int>& a) {// write code hereint ans = 0, MIN = INT_MAX;for(int i = n-1; i >= 0; --i){if(a[i] > MIN)ans++;MIN = min(MIN, a[i]);}return ans;}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!