原题链接
不断翻转数组的前面的几个元素达到排序的效果。
思路:
- 每次找到没有被交换到数组首位的最小值元素,并将包括该元素之前的所有元素翻转;
- 在数组中寻找到下一个最小值元素,并将不包括该最小值元素之前的所有元素翻转,那么最小值和次最小值放在了一起;
- 重复步骤1 ;
- 途中利用下表index记录翻转的长度;
- 该思路中有一些稍微的冗余,比如,当第一步完成后,次小值与最小值已经在一块了,就没有必要进行下一步翻转,应当跳过一次。如果想在结果数组中优化,就去掉数组中挨在一块的相同的元素的一个;否则需要添加判断条件;
- 利用了STL的reverse(arr.begin(), arr.end())函数,该函数将输入的数组倒置;时间复杂度:O(n^2);
class Solution {
public:
vector<int> pancakeSort(vector<int>& arr) {
int myLen = arr.size();
vector<int> visiteds(myLen); //标记数组,记录此元素是否已经作为最小值元素
vector<int> resultArr; //存放结果的数组
int index = -1;
for(int i = 0; i < myLen; i++){
int currentMin = 1000000000; //搞一个最大值用来寻找没有作为最小值的元素
for(int j = 0; j < myLen; j++){
if(arr[j]<currentMin && visiteds[j]== 0){
currentMin = arr[j];
index = j;
}
}
visiteds[index] = 1; //将当前最小值元素标记为已访问
if(index > 1){ //如果该元素在前两个的话,没有必要进行翻转
resultArr.push_back(index);
reverse(arr.begin(), arr.begin()+index);
reverse(visiteds.begin(),visiteds.begin()+index);
}
resultArr.push_back(index+1);
reverse(arr.begin(), arr.begin()+index+1);
reverse(visiteds.begin(),visiteds.begin()+index+1); //访问数组也要跟着动
}
resultArr.push_back(myLen);
reverse(arr.begin(),arr.end());
cout<<endl;
return resultArr;
}
};