LeetCode 969 煎餅排序

2021-10-02 22:16:18 字數 1761 閱讀 2993

給定陣列 a,我們可以對其進行煎餅翻**我們選擇一些正整數 k <= a.length,然後反轉 a 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉(按順序一次接一次地進行)以完成對陣列 a 的排序。

返回能使 a 排序的煎餅翻轉操作所對應的 k 值序列。任何將陣列排序且翻轉次數在 10 * a.length 範圍內的有效答案都將被判斷為正確。

示例 1:

輸入:[3,2,4,1]

輸出:[4,2,4,3]

解釋:我們執行 4 次煎餅翻轉,k 值分別為 4,2,4,和 3。

初始狀態 a = [3, 2, 4, 1]

第一次翻轉後 (k=4): a = [1, 4, 2, 3]

第二次翻轉後 (k=2): a = [4, 1, 2, 3]

第三次翻轉後 (k=4): a = [3, 2, 1, 4]

第四次翻轉後 (k=3): a = [1, 2, 3, 4],此時已完成排序。

示例 2:

輸入:[1,2,3]

輸出:解釋:

輸入已經排序,因此不需要翻轉任何內容。

請注意,其他可能的答案,如[3,3],也將被接受。

1 <= a.length <= 100

a[i] 是 [1, 2, …, a.length] 的排列

真不知道這種題目的意義何在,有些許雞肋。。。 思路

我們可以將最大的元素(在位置 i,下標從 1 開始)進行煎餅翻轉 i 操作將它移動到序列的最前面,然後再使用煎餅翻轉 a.length 操作將它移動到序列的最後面。 此時,最大的元素已經移動到正確的位置上了,所以之後我們就不需要再使用 k 值大於等於 a.length 的煎餅翻轉操作了。

我們可以重複這個過程直到序列被排好序為止。 每一步,我們只需要花費兩次煎餅翻轉操作。

演算法我們從陣列 a 中的最大值向最小值依次進行列舉,每一次將列舉的元素放到正確的位置上。

每一步,對於在位置 i 的(從大到小列舉的)元素,我們會使用思路中提到的煎餅翻轉組合操作將它移動到正確的位置上。 值得注意的是,執行一次煎餅翻轉操作 f,會將位置在 i, i <= f 的元素翻轉到位置 f+1 - i 上。

class

solution

arrays.

sort

(b,(i, j)

-> a[j-1]

- a[i-1]

);for(

int i : b)

} ans.

add(i)

; ans.

add(n--);

}return ans;

}}

class

solution

:def

pancakesort

(self, a: list[

int])-

> list[

int]

: ans =

n =len(a)

b =sorted

(range(1

, n+1)

, key =

lambda i:

-a[i-1]

)for i in b:

for f in ans:

if i <= f:

i = f +

1- i

ans.extend(

[i, n]

) n -=

1return ans

leetcode 969 煎餅排序

題目 給定陣列 a,我們可以對其進行煎餅翻 我們選擇一些正整數 k a.length,然後反轉 a 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉 按順序一次接一次地進行 以完成對陣列 a 的排序。返回能使 a 排序的煎餅翻轉操作所對應的 k 值序列。任何將陣列排序且翻轉次數在 10 a.le...

LeetCode 969 煎餅排序

給定陣列 a,我們可以對其進行煎餅翻 我們選擇一些正整數 k a.length,然後反轉 a 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉 按順序一次接一次地進行 以完成對陣列 a 的排序。返回能使 a 排序的煎餅翻轉操作所對應的 k 值序列。任何將陣列排序且翻轉次數在 10 a.lengt...

leetcode 969 煎餅排序

969.煎餅排序 給定陣列 a,我們可以對其進行煎餅翻 我們選擇一些正整數 k a.length,然後反轉 a 的前 k 個元素的順序。我們要執行零次或多次煎餅翻轉 按順序一次接一次地進行 以完成對陣列 a 的排序。返回能使 a 排序的煎餅翻轉操作所對應的 k 值序列。任何將陣列排序且翻轉次數在 1...