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;
}
看了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;
}
相关文章推荐
- 1101. Quick Sort (25)
- PAT 1101. Quick Sort (25) 枢轴判断
- 【PAT】1101. Quick Sort (25)
- PAT 甲级 1101. Quick Sort (25)
- PAT 1101. Quick Sort (25)
- PAT (Advanced Level) Practise 1101 Quick Sort (25)
- 1101. Quick Sort (25)
- 1101. Quick Sort (25)
- [PAT]1101. Quick Sort (25)
- PAT (Advanced Level) Practise 1101 Quick Sort (25)
- 1101. Quick Sort (25)
- 【PAT-A】1101. Quick Sort (25)
- 1101. Quick Sort (25)
- 1101. Quick Sort (25)
- pat 1101. Quick Sort (25)
- 1101.Quick Sort (25)
- PAT-PAT (Advanced Level) Practise 1101 Quick Sort (25)【二星级】
- PTA甲 1101. Quick Sort (25)
- PAT_A 1101. Quick Sort (25)
- pat 1101. Quick Sort (25)