diff --git a/Algorithms/969. Pancake Sorting/969. Pancake Sorting.go b/Algorithms/969. Pancake Sorting/969. Pancake Sorting.go new file mode 100644 index 00000000..6fe9b503 --- /dev/null +++ b/Algorithms/969. Pancake Sorting/969. Pancake Sorting.go @@ -0,0 +1,39 @@ +package leetcode + +func pancakeSort(A []int) []int { + if len(A) == 0 { + return []int{} + } + right := len(A) + var ( + ans []int + ) + for right > 0 { + idx := find(A, right) + if idx != right-1 { + reverse_(A, 0, idx) + reverse_(A, 0, right-1) + ans = append(ans, idx+1, right) + } + right-- + } + + return ans +} + +func reverse_(nums []int, l, r int) { + for l < r { + nums[l], nums[r] = nums[r], nums[l] + l++ + r-- + } +} + +func find(nums []int, t int) int { + for i, num := range nums { + if num == t { + return i + } + } + return -1 +} diff --git a/Algorithms/969. Pancake Sorting/969. Pancake Sorting_test.go b/Algorithms/969. Pancake Sorting/969. Pancake Sorting_test.go new file mode 100644 index 00000000..b44b3722 --- /dev/null +++ b/Algorithms/969. Pancake Sorting/969. Pancake Sorting_test.go @@ -0,0 +1,52 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question969 struct { + para969 + ans969 +} + +// para 是参数 +// one 代表第一个参数 +type para969 struct { + one []int +} + +// ans 是答案 +// one 代表第一个答案 +type ans969 struct { + one []int +} + +func Test_Problem969(t *testing.T) { + + qs := []question969{ + + question969{ + para969{[]int{}}, + ans969{[]int{}}, + }, + + question969{ + para969{[]int{1}}, + ans969{[]int{1}}, + }, + + question969{ + para969{[]int{3, 2, 4, 1}}, + ans969{[]int{3, 4, 2, 3, 1, 2}}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 969------------------------\n") + + for _, q := range qs { + _, p := q.ans969, q.para969 + fmt.Printf("【input】:%v 【output】:%v\n", p, pancakeSort(p.one)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/969. Pancake Sorting/README.md b/Algorithms/969. Pancake Sorting/README.md new file mode 100644 index 00000000..052db64b --- /dev/null +++ b/Algorithms/969. Pancake Sorting/README.md @@ -0,0 +1,43 @@ +# [969. Pancake Sorting](https://leetcode.com/problems/pancake-sorting/) + +## 题目 + +Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, then reverse the order of the first k elements of A. We want to perform zero or more pancake flips (doing them one after another in succession) to sort the array A. + +Return the k-values corresponding to a sequence of pancake flips that sort A. Any valid answer that sorts the array within 10 * A.length flips will be judged as correct. + +Example 1: + +```c +Input: [3,2,4,1] +Output: [4,2,4,3] +Explanation: +We perform 4 pancake flips, with k values 4, 2, 4, and 3. +Starting state: A = [3, 2, 4, 1] +After 1st flip (k=4): A = [1, 4, 2, 3] +After 2nd flip (k=2): A = [4, 1, 2, 3] +After 3rd flip (k=4): A = [3, 2, 1, 4] +After 4th flip (k=3): A = [1, 2, 3, 4], which is sorted. +``` + +Example 2: + +```c +Input: [1,2,3] +Output: [] +Explanation: The input is already sorted, so there is no need to flip anything. +Note that other answers, such as [3, 3], would also be accepted. +``` + +Note: + +- 1 <= A.length <= 100 +- A[i] is a permutation of [1, 2, ..., A.length] + +## 题目大意 + +给定一个数组,要求输出“煎饼排序”的步骤,使得最终数组是从小到大有序的。“煎饼排序”,每次排序都反转前 n 个数,n 小于数组的长度。 + +这道题的思路是,每次找到当前数组中无序段中最大的值,(初始的时候,整个数组相当于都是无序段),将最大值的下标 i 进行“煎饼排序”,前 i 个元素都反转一遍。这样最大值就到了第一个位置了。然后紧接着再进行一次数组总长度 n 的“煎饼排序”,目的是使最大值到数组最后一位,这样它的位置就归位了。那么数组的无序段为 n-1 。然后用这个方法不断的循环,直至数组中每个元素都到了排序后最终的位置下标上了。最终数组就有序了。 + +这道题有一个特殊点在于,数组里面的元素都是自然整数,那么最终数组排序完成以后,数组的长度就是最大值。所以找最大值也不需要遍历一次数组了,直接取出长度就是最大值。