https://pintia.cn/problem-sets/994805342720868352/problems/994805403651522560
10
3 5 7 2 6 4 9 0 8 1
先看0的位置:与7交换
3 5 0 2 6 4 9 7 8 1
再与2:
3 5 2 0 6 4 9 7 8 1
再与3:
0 5 2 3 6 4 9 7 8 1
现在是0的位置,那就与距离它最近的,不在正确的位置上的进行交换:
5 0 2 3 6 4 9 7 8 1
再重复过程就可以了
可以优化的一个地方是:
这个地方,没有在正确位置的数字而且没有与不在0位置的零交换的肯定是升序的(就是那些0没有占用他们的位子的交换不算)
还是觉得没有表达出来
那就,写一下代码:
#include <algorithm>
#include<iostream>
#include<stdio.h>
#include<string>
#include <vector>
using namespace std;
vector<int> v;
int n;
int k;
int next_no_position(int a){//返回下一个没有排好的
for (int i = k; i < n; ++i) {
if(v[i]==i) {
continue;
}
else{
return i;
}
}
return -1;
}
int swap(int pos){//直接返回0的位置了
int i;
for ( i = 0; i < n; ++i) {//主要是这里麻烦了,因为你每次都要遍历
if(v[i]==pos){
break;
}
}
v[i]=0;
v[pos]=pos;
return i;
}
void print(){
for (int i = 0; i < n; ++i) {
cout<<v[i]<<" ";
}
cout<<endl;
}
int main(){
cin>>n;
int pos=0;
for (int i = 0; i < n; ++i) {
int q;
cin>>q;
v.push_back(q);
if(q==0)
pos=i;
}
int num=0;
int flag=0;
while(flag!=-1){
if(pos==0){
flag=next_no_position(flag);//0 1 3 2-->flag=2 --> 3 1 0 2-->3 1 2 0 --> 0 1 2 3
k=flag;
if(flag==-1){
break;
}
cout<<"flag"<<flag<<endl;
v[0]=v[flag];
v[flag]=0;
pos=flag;
//print();
num++;
}
else{
pos=swap(pos);
//print();
num++;
}
}
cout<<num;
}
结果,TLE了两个测试点...
最后看了一下书上的题解,发现其实我存数据的时候出现了问题,一开始定义的时候,v[i]=j定义成数字i在j这个位置上,swap函数就不用遍历一遍了.我存的时候是第i个位置上是数字j,所以找的时候还需要遍历,,,,
代码就不贴了我才不会说我没写
喔,就刚刚那个代码,还是觉得代码写少了,为啥呢?有一个赋值先更改了它的值才更新的,,数据结构的痛呜呜