leetcode969 煎饼排序

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值