LeetCode 969 煎饼排序

原题链接
不断翻转数组的前面的几个元素达到排序的效果。
思路:

  1. 每次找到没有被交换到数组首位的最小值元素,并将包括该元素之前的所有元素翻转;
  2. 在数组中寻找到下一个最小值元素,并将不包括该最小值元素之前的所有元素翻转,那么最小值和次最小值放在了一起;
  3. 重复步骤1 ;
  4. 途中利用下表index记录翻转的长度;
  5. 该思路中有一些稍微的冗余,比如,当第一步完成后,次小值与最小值已经在一块了,就没有必要进行下一步翻转,应当跳过一次。如果想在结果数组中优化,就去掉数组中挨在一块的相同的元素的一个;否则需要添加判断条件;
  6. 利用了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;
    }

};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值