煎饼排序——选择排序的运用
这篇题解将“煎饼排序”转化为选择排序思路:每轮把当前最大值放到末尾。题目理解题目不要求最优翻转序列,只要求得到可行解。因此可以优先采用实现简单、可证明正确的构造策略。关键是明确每轮目标:固定一个末尾元素。核心策略找到当前未排序区间的最大值位置。先翻转前缀把最大值翻到首位。再翻转当前区间把它送到末尾。复杂度与实现每轮最多…
题目 题目链接 题目解题思路 读懂题目: 此题并不是要我们求出类似于示例所给的最优情况的方式得出答案。 他只要能够翻转成有序的操作序列即可。 故我们可以按照选择排序的思路,利用翻转能够将首尾交换,来进行两次翻转把最大值移动到最后的位置,第一次翻转到首位,第二次翻转到后面的位置即可。 具体例子: 例如:[3,2,4,1]---->[?,?,?,4] 我们可以先找到数字4的位置,将数字4前进行翻转变成[4,2,3,1],接下来我们在整体翻转[1,3,2,4],这样我们把数字4移动列表底. 然后,我们[1,3,2,4]--->[?,?,3,4],还是用刚才方法,首先找到数字3,翻转数字3前面的,再翻转已经排好数字(这里指数字4)前就可以了.解题代码class Solution { public: vector<int> pancakeSort(vector<int> &arr) { int n = arr.size(); vector<int> ret; while (n > 1) { if (arr[n - 1] != n) { int index = find_if(arr.begin(), arr.end(), [n](auto &num) { if (num == n) return true; return false; }) - arr.begin(); ret.push_back(index + 1); ret.push_back(n); reverse(arr.begin(), arr.begin() + index + 1); reverse(arr.begin(), arr.begin() + n); } --n; } return ret; } };
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行