Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort

简介: Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort

324. 摆动排序 II Wiggle Sort ii

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。

你可以假设所有输入数组都可以得到满足题目要求的结果。

示例 1:

输入:nums = [1,5,1,1,6,4]

输出:[1,6,1,5,1,4]

解释:[1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受。


示例 2:

输入:nums = [1,3,2,2,3,1]

输出:[2,3,1,3,1,2]


提示:

  • 1 <= nums.length <= 5 * 10^4
  • 0 <= nums[i] <= 5000
  • 题目数据保证,对于给定的输入 nums ,总能产生满足题目要求的结果

进阶:你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?

代码:

package main
import "fmt"
func wiggleSort(nums []int) {
  n := len(nums)
  if n <= 1 {
    return
  }
  heapSort(nums)
  mid := n / 2
  if n%2 == 0 {
    mid--
  }
  temp := make([]int, n)
  copy(temp, nums)
  // 将较小的元素从末尾开始插入,较大的元素从中间位置开始插入
  for i, j := 0, mid; i < n; i, j = i+2, j-1 {
    nums[i] = temp[j]
  }
  for i, j := 1, n-1; i < n; i, j = i+2, j-1 {
    nums[i] = temp[j]
  }
}
// 堆排序
func heapSort(nums []int) {
  n := len(nums)
  // 建堆
  for i := n/2 - 1; i >= 0; i-- {
    adjustHeap(nums, i, n)
  }
  // 排序
  for i := n - 1; i > 0; i-- {
    nums[0], nums[i] = nums[i], nums[0]
    adjustHeap(nums, 0, i)
  }
}
// 调整堆
func adjustHeap(nums []int, root, n int) {
  for {
    child := 2*root + 1
    if child >= n {
      break
    }
    if child+1 < n && nums[child+1] > nums[child] {
      child++
    }
    if nums[child] > nums[root] {
      nums[child], nums[root] = nums[root], nums[child]
    }
    root = child
  }
}
func main() {
  nums1 := []int{1, 5, 1, 1, 6, 4}
  wiggleSort(nums1)
  fmt.Println(nums1)
  nums2 := []int{1, 3, 2, 2, 3, 1}
  wiggleSort(nums2)
  fmt.Println(nums2)
}

输出:

[1 6 1 5 1 4]

[2 3 1 3 1 2]


280. 摆动排序 I Wiggle Sort i

给你一个没有排序的数组,请将原数组就地重新排列满足如下性质:nums[0] <= nums[1] >= nums[2] <= nums[3]......请写一个函数实现此排序功能。

示例 :

输入:nums = [3, 5, 2, 1, 6, 4]

输出:[1, 6, 2, 5, 3, 4]

代码:

package main
import "fmt"
func wiggleSort(nums []int) {
  n := len(nums)
  findKthSmallest(nums, 0, n-1, n/2)
  mid := nums[n/2]
  i, j, k := 0, 0, n-1
  for j <= k {
    if nums[j] < mid {
      nums[i], nums[j] = nums[j], nums[i]
      i++
      j++
    } else if nums[j] > mid {
      nums[j], nums[k] = nums[k], nums[j]
      k--
    } else {
      j++
    }
  }
  for i, j := 1, n-1; i < j; i, j = i+2, j-2 {
    nums[i], nums[j] = nums[j], nums[i]
  }
}
func findKthSmallest(nums []int, left, right, k int) {
  if left == right {
    return
  }
  pivot := partition(nums, left, right)
  if k == pivot {
    return
  } else if k < pivot {
    findKthSmallest(nums, left, pivot-1, k)
  } else {
    findKthSmallest(nums, pivot+1, right, k)
  }
}
func partition(nums []int, left, right int) int {
  pivot := nums[left]
  for left < right {
    for left < right && nums[right] >= pivot {
      right--
    }
    nums[left] = nums[right]
    for left < right && nums[left] <= pivot {
      left++
    }
    nums[right] = nums[left]
  }
  nums[left] = pivot
  return left
}
func main() {
  nums := []int{3, 5, 2, 1, 6, 4}
  wiggleSort(nums)
  fmt.Println(nums)
}

输出:

[3 1 5 2 6 4]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更


目录
相关文章
|
2月前
|
存储 编译器 C++
在C++语言中计算并打印出两个数的求和
在C++语言中计算并打印出两个数的求和
44 0
|
18天前
|
Go
【golang】golang 字符串切片排序
【golang】golang 字符串切片排序
14 1
|
2月前
|
存储 Go
第八章 Golang排序和查找
第八章 Golang排序和查找
26 3
|
2月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
71 1
Linux 终端操作命令(1)
|
2月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
64 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
2月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
35 0
Linux 终端命令之文件浏览(4) head, tail
|
2月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
40 0
Linux 终端命令之文件浏览(2) more
|
2月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
53 0
Linux 终端操作命令(3)内部命令用法
|
2月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
32 0
Linux 终端操作命令(2)内部命令
|
2月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
134 0
Linux系统部署Python语言开发运行环境