【leetcode 969】 煎餅排序(選擇排序)
阿新 • • 發佈:2019-01-06
題意:
給定一個序列,每次只允許翻轉序列的前K個元素,求一個翻轉的序列K,使得原序列有序。
思路:
一開始真心沒有思路。
參照選擇排序的思路,每次找到當前序列的最大值X,然後翻轉兩次把X放到最後面就行了。最多需要翻轉2*N次。
怎麼樣兩次把最大值放到後面呢,假設最大值在index,先翻轉index,那麼最大值就到了第一個,在翻轉未排好序的部分,那麼未排好序的部分的最大值就到了未排好序的最後一個位置。即可。
class Solution { public: int num = 0; vector<int>ve; vector<int> pancakeSort(vector<int>& A) { num = 0; ve.clear(); if(A.size()==1) return ve; get_ans(A); return ve; } void get_ans(vector<int>& A) { int sz = A.size(); int ma = 0,index=0; for(int i=0; i<sz-num; i++) //找最大值和其下標 { if(A[i]>ma) { ma = A[i]; index = i; } } ve.push_back(index+1); ve.push_back(sz-num); if(num+1==sz-1) return ; vector<int>ans; for(int i=sz-num-1; i>index; i--) { ans.push_back(A[i]); } for(int i=0; i<index; i++) //把最大值之後的,已排好序之前的數字放入,只翻轉了一次,順序需要改變 ans.push_back(A[i]); ans.push_back(A[index]); for(int i=sz-num; i<sz; i++) //把在最大值之前的數字放入,因為翻轉了兩次,所以原順序不變 ans.push_back(A[i]); num++; get_ans(ans); } };