PAT甲级1101 Quick Sort (25分)|C++实现

一、题目描述

原题链接
在这里插入图片描述

Input Specification:

在这里插入图片描述

​​Output Specification:

在这里插入图片描述

Sample Input:

5
1 3 2 4 5

Sample Output:

3
1 4 5

二、解题思路

这道题抽象出来其实就是判断一个序列中哪些数满足左边的数都比它小而右边的数都比它大这个条件,我们可以用mxm数组表示每个位置左边最大的数,用minm数组表示每个位置右边最小的数,这两个数组更新完之后,遍历所有数,如果满足v[i] > mxm[i] && v[i] < minm[i],则我们可以把该元素存入答案数组,最后输出即可。

三、AC代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 100010;
const int INF = 1000000001;
LL mxm[maxn] = {0}; //每个位置左边的最大值
LL minm[maxn] = {INF};  //每个位置右边的最小值
int main()
{
  int N, cnt = 0;
  LL tmp;
  scanf("%d", &N);
  vector<LL> v, ans;
  for(int i=0; i<N; i++)
  {
    scanf("%lld", &tmp);
    v.push_back(tmp);
    if(i==0)	mxm[i] = 0; //第一个元素左边没有任何数,记左边的最大值为0
    else
    {
      if(v[i-1] > mxm[i-1])	mxm[i] = v[i-1];    //如果前一个元素大于前一个元素左边所有元素的最大值,则当前元素左边最大数即为前一个数
      else	mxm[i] = mxm[i-1];  //否则当前元素左边最大数即为前一个数左边最大数
    }
  }
  int sze = v.size();
  for(int i=sze-1; i>=0; i--)
  {
    if(i==sze-1)	minm[i] = INF;  //最后一个数的右边没有数,我们把它右边的最小值设为INF
    else
    {
      if(v[i+1] < minm[i+1])	minm[i] = v[i+1];   //类似地,如果后一个数比后一个数右边的最小的数还小,则当前元素右边最小数即为后一个数
      else	minm[i] = minm[i+1];
    }
  }
  for(int i=0; i<sze; i++)
  {
    if(v[i] > mxm[i] && v[i] < minm[i]) //满足条件的数存入ans
      ans.push_back(v[i]);
  }
  sze = ans.size();
  printf("%d\n", sze);
  for(int i=0; i<sze; i++)
  {
    if(i==0)	printf("%d", ans[i]);
    else	printf(" %d", ans[i]);
  }
  printf("\n");
  return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值