摘要:本文将对两道LeetCode原题进行介绍,分别是煎饼排序和不含AAA或者BBB的字符串。在陈述完基本的思路后,本文给出基于golang语言实现的代码,实现都是通过了所有测试用例且运行时间超过100%的优质解法,最后给出相应的复杂度分析。
关键词:算法,LeetCode,Golang,排序,双指针
煎饼排序
原题描述
LeetCode 969 煎饼排序:对于一个数组nums,每一次可以选择一个数k(1 << k << len(nums)),将nums[:k]范围内的数字进行翻转,现在需要基于这种翻转操作完成数组的排序,给出能将数组排好序的k值的一个序列。注意,任何长度小于10 * len(nums)的可行序列都是正确的。
思路简述
可以这样去想,对于任何一个位置k的数来说,我们都可以通过两次翻转操作将其移动到数组的尾部,分别是翻转nums[: k]和翻转整个nums,第一次翻转将这个数翻到了头部,第二次则是将其翻转到了尾部。因此,我们可以每一次都针对最大数进行以上的翻转,然后下一次考虑更小的一个序列。这样就能够完成整个数组的排序,且翻转次数不会超过2 * (n - 1)次。
代码实现
func pancakeSort(arr []int) []int {
n := len(arr)
res := make([]int, 0, 2 * n)
for i := n - 1; i > 0; i-- {
// 先找当前序列[0: i]的最大数的位置
maxi := 0
for j := 0; j <= i; j++ {
if arr[j] > arr[maxi] {
maxi = j
}
}
if maxi == i {
// 最大数在当前序列的尾部,不需要翻转
continue
}
if maxi != 0 {
// 最大数在头部,只需要进行第二次翻转
res = append(res, maxi + 1