您的位置:首页 > 产品设计 > UI/UE

1101. Quick Sort (25)

2016-11-23 02:14 429 查看
搞了半天第三个测试点格式错误

看了http://blog.csdn.net/u014646950/article/details/48399089她的知道两个换行一个不能少,不管是不是0个数

改进了两次,为了练习一下set的用法,就尽量用了一下,不过后来感觉运行时间还可以压缩点,就改进了一下

说下我的思路:

step 1:从左到右扫描记录当前位置之前的最大值,并与之比较,当前位置的值小于前面的最大值进入丢弃点下标集合s1;

step 2:同理从右到左扫描,得到丢弃点集合s2;

step 3:取s1和s2的并集s3;

step 4:用整体的下标集合U-s3,得最后输出下标集合s4;

step 5:下标对应值升序输出。

第三次版本,没用set,最后sort排序时间复杂度Nlog2N,整体就是Nlog2N:



#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int MAX = 100010;
vector<int> a,notp,out;
int visited[MAX]={0};
int main(){
int max,min,n;
cin>>n;
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
a.push_back(temp);
}
int count=0;
//从左到右遍历记录当前之前的最大值,与当前值比较如果当前值小于
max=a[0];
for(int i=1;i<n;i++){
if(a[i]<max){
notp.push_back(i);
}
else max=a[i];
}
//同理从右到左
min=a[n-1];
for(int i=n-2;i>=0;i--){
if(a[i]>min){
notp.push_back(i);
}
else min=a[i];
}
for(vector<int>::iterator it=notp.begin();it!=notp.end();it++){
visited[*it]=1;
}
for(int i=0;i<n;i++){
if(visited[i]==0){
out.push_back(a[i]);
count++;
}
}
sort(out.begin(),out.end());
int flag=0;
printf("%d",count);
printf("\n");
for(vector<int>::iterator it=out.begin();it!=out.end();it++){
if(flag!=0) printf(" ");
printf("%d",*it);
flag=1;
}
printf("\n");
return 0;
}第二次



#include<iostream>
#include<vector>
#include<set>
using namespace std;
const int MAX = 100010;
vector<int> a,notp;
set<int> out;
int visited[MAX]={0};
int main(){
int max,min,n;
cin>>n;
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
a.push_back(temp);
}
int count=0;
//从左到右遍历记录当前之前的最大值,与当前值比较如果当前值小于,count+1
max=a[0];
for(int i=1;i<n;i++){
if(a[i]<max){
notp.push_back(i);
}
else max=a[i];
}
//同理从右到左
min=a[n-1];
for(int i=n-2;i>=0;i--){
if(a[i]>min){
notp.push_back(i);
}
else min=a[i];
}
for(vector<int>::iterator it=notp.begin();it!=notp.end();it++){
visited[*it]=1;
}
for(int i=0;i<n;i++){
if(visited[i]==0){
out.insert(a[i]);
count++;
}
}
int flag=0;
printf("%d",count);
printf("\n");
for(set<int>::iterator it=out.begin();it!=out.end();it++){
if(flag!=0) printf(" ");
printf("%d",*it);
flag=1;
}
printf("\n");
return 0;
}

第一次



#include<iostream>
#include<vector>
#include<set>
using namespace std;
const int MAX = 100010;
vector<int> a;
set<int> notp,out;
int visited[MAX]={0};
int main(){
int max,min,n;
cin>>n;
for(int i=0;i<n;i++){
int temp;
scanf("%d",&temp);
a.push_back(temp);
}
int count=0;
max=a[0];
for(int i=1;i<n;i++){
if(a[i]<max){
notp.insert(i);
}
else max=a[i];
}
//同理从右到左
min=a[n-1];
for(int i=n-2;i>=0;i--){
if(a[i]>min){
notp.insert(i);
}
else min=a[i];
}
count=n-notp.size();
for(set<int>::iterator it=notp.begin();it!=notp.end();it++){
visited[*it]=1;
}
for(int i=0;i<n;i++){
if(visited[i]==0) out.insert(a[i]);
}
int flag=0;
printf("%d",count);
printf("\n");
for(set<int>::iterator it=out.begin();it!=out.end();it++){
if(flag!=0) printf(" ");
printf("%d",*it);
flag=1;
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT quicksort