leetcode 969 煎饼排序
给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k<=A.length,然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。
返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。
示例:
输入:[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],此时已完成排序。
输入:[1,2,3]
输出:[]
解释:
输入已经排序,因此不需要翻转任何内容。
请注意,其他可能的答案,如[3,3],也将被接受。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pancake-sorting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
这道题的思路即找到最大值,首先翻转到第一位,再翻转整个未排序好的数组部分,将其翻转到最末位,再对剩下的数做类似的操作,直到完全排序
*****踩坑:如果最大值已经在末位了则不需要做操作,这一判断需要在翻转之前,否则针对[1,2,3]这样的顺序情况,会发生错误。
代码:
func pancakeSort(A []int) []int {
length := len(A) - 1
result := make([]int, 0)
for length >= 0 {
index := 0
num_max := 0
for i := 0; i < length+1 ; i++ {
if A[i] > num_max {
index = i
num_max = A[i]
}
}
if index == length {
length--
continue
}
if index != 0 {
result = append(result, index+1)
Reverse(A, 0, index)
}
result = append(result, length+1)
Reverse(A, 0, length)
length--
}
return result
}
func Reverse(A []int, intial int, length int) {
for intial < length {
A[intial], A[length] = A[length], A[intial]
length--
intial++
}
}
测试:
调用:
package main
import "fmt"
func main(){
nums := []int{3,2,4,1}
var result []int
result = pancakeSort(nums)
fmt.Println("%d",result)
}
结果:
我们可以推演一下:
原数组:3,2,4,1——>4,2,3,1——>1,3,2,4——>3,1,2,4——>2,1,3,4
——>1,2,3,4
结果正确
时间复杂度:
时间复杂度:O(N^2),其中 N是数组 A 的长度。
空间复杂度:O(N)