第四章:烧饼排序算法

labuladong烧饼排序算法

969. 煎饼排序

通过递归思想解决问题 (本题找到可行解即可,因此与示例的输出不一致,但仍能通过测试用例)

  • 先把最大的烧饼放到最后面。怎么放呢?
    • 找到最大烧饼对应的索引,翻转0到索引处的烧饼,先使最大烧饼放到最前面(并记录翻转处:1+索引值(因为结果从1开始计数))
    • 然后翻转整个烧饼列,使得最前面的最大烧饼挪到最后面(并记录翻转处:最后面的n)
  • 最大烧饼的位置不要动,翻转1到次大烧饼(因为是同样的问题,所以用递归)
class Solution {
private:
    vector<int> res{};
public:
    void sortN(vector<int> nums) {
//        递归结束的条件:只有一个烧饼了
        int n=nums.size();
        if (n == 1) return;

//        找到最大值对应的索引
        int maxIdx = max_element(nums.begin(), nums.end()) - nums.begin();
//        翻转开头到索引的烧饼
        reverse(nums.begin(), nums.begin() + maxIdx+1);
        res.push_back(1 + maxIdx); // 记录位置
        reverse(nums.begin(), nums.end()); // 翻转整个烧饼列
        res.push_back(n); // 记录位置

//        缩小烧饼列,翻转n-1个烧饼
        nums.assign(nums.begin(),nums.end()-1);
        sortN(nums);
    }

    vector<int> pancakeSort(vector<int> &arr) {
        sortN(arr);
        return res;
    }
};
class Solution(object):
    def pancakeSort(self, arr):
        """
        :type arr: List[int]
        :rtype: List[int]
        """
        res=[]

        def dfs(arr):
            if len(arr)==1:
                return

            max_idx=arr.index(max(arr))
            arr=arr[:max_idx+1][::-1]+arr[max_idx+1:] # 翻转开头到最大索引的部分
            res.append(max_idx+1) # 记录位置
            arr=arr[::-1] # 翻转整个列表
            res.append(len(arr)) # 记录位置
            dfs(arr[:-1]) # 缩小规模,翻转n-1个烧饼
        dfs(arr)
        return res
# so=Solution()
# print(so.pancakeSort([3,2,4,1]))

   转载规则


《第四章:烧饼排序算法》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第一章:题目不让我干什么,我偏要干什么 第一章:题目不让我干什么,我偏要干什么
labuladong题目不让我干什么,我偏要干什么 341. 扁平化嵌套列表迭代器示例 :输入:nestedList = [1,[4,[6]]]输出:[1,4,6]解释:通过重复调用 next 直到 hasNext 返回 false,nex
2021-08-19
下一篇 
第三章:如何用 BFS 算法秒杀各种智力题 第三章:如何用 BFS 算法秒杀各种智力题
labuladong 如何用 BFS 算法秒杀各种智力题 BFS是一种“齐头并进”遍历树的方式 要用到队列。在while的for循环中,把当前队头pop出去。若找到目标了,则return。若没有找到,则把队头对应的相邻节点(如果这个相邻节
2021-08-17
  目录