PAT 链表倒序的算法优化
之前的答案错误问题已经解决了,现在还有运行超时的问题,先贴上之前的代码
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 int main() 6 { 7 int count, renum; 8 string add; 9 cin>>add>>count>>renum; 10 string add1[count],add2[count],madd1[count],madd2[count]; 11 int mnum[count],num[count]; 12 for(int i=0;i<count;i++) 13 { 14 cin>>add1[i]>>num[i]>>add2[i]; 15 } 16 for(int i=0;i<count;i++) 17 { 18 19 for(int j=0;j<count;j++) 20 { 21 if(add1[j]==add) 22 { 23 madd1[i] = add1[j]; 24 mnum[i]=num[j]; 25 madd2[i] = add2[j]; 26 add=madd2[i]; 27 break; 28 } 29 } 30 } 31 int temp=0; 32 int fake = count; 33 while(count-renum>=0) 34 { 35 for(int i= temp,j=temp+renum-1;i<=temp+renum-1;i++,j--) 36 { 37 add1[i] = madd1[j]; 38 num[i] = mnum[j]; 39 } 40 count-=renum; 41 temp=temp+renum; 42 } 43 for(int i=temp;i<fake;i++) 44 { 45 46 add1[i] = madd1[i]; 47 num[i] = mnum[i]; 48 } 49 for(int i=0;i<fake-1;i++) 50 { 51 add2[i]=add1[i+1]; 52 } 53 add2[fake-1] = "-1"; 54 for(int i=0;i<fake;i++) 55 { 56 cout<<add1[i]<<" "<<num[i]<<" "<<add2[i]<<endl; 57 } 58 return 0; 59 }
这个程序的复杂度为o(n*n),现在想办法降低复杂度,分析可以发现大部分时间是花在将输入数据按顺序排序上,然后我想到如果输入数据的每一行的第一个,和第三个数据真的表示为地址的话,就省去了排序的时间,所以,我们可以开一个10w数组,数组下标表示地址,以此来减少排序时间。具体实现代码如下
1 #include <iostream> 2 #include <string.h> 3 #include <iomanip> 4 using namespace std; 5 6 int main() 7 { 8 int count ,add,renum; 9 cin>>add>>count>>renum; 10 int add1[100001],num[100001],add2[100001]; 11 for(int i=0;i<=100000;i++) 12 { 13 add1[i]=0; 14 add2[i]=0; 15 num[i]=0; 16 } 17 for(int i=0;i<count;i++) 18 { 19 int a,b,c; 20 cin>>a>>b>>c; 21 add1[a]=a; 22 num[a]=b; 23 add2[a]=c; 24 25 } 26 add2[100000]=add; 27 int before=100000; 28 int late=-1; 29 int re[renum]; 30 int total=0; 31 int sha=100000; 32 while(add2[sha]!=-1) 33 { 34 sha=add2[sha]; 35 total++; 36 } 37 int xunh = total/renum; 38 for(int j=0;j<xunh;j++) 39 { 40 int x = add2[before]; 41 for(int i=0;i<renum;i++) 42 { 43 re[renum-1-i] = x; 44 x=add2[x]; 45 if(i==renum-1) 46 { 47 late = x; 48 } 49 } 50 add2[before] = re[0]; 51 for(int i=0;i<renum-1;i++) 52 { 53 add2[re[i]] = re[i+1]; 54 } 55 add2[re[renum-1]] = late; 56 before = re[renum-1]; 57 } 58 int m =100000; 59 while(m!=-1) 60 { 61 m=add2[m]; 62 if(m!=-1 &&add2[m]!=-1) 63 cout<<setw(5)<<setfill(‘0‘)<<add1[m]<<" "<<num[m]<<" "<<setw(5)<<setfill(‘0‘)<<add2[m]<<endl; 64 else if(m!=-1) 65 cout<<setw(5)<<setfill(‘0‘)<<add1[m]<<" "<<num[m]<<" "<<add2[m]<<endl; 66 } 67 return 0; 68 }
上传检验成功。
以上。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。