mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-04 16:12:47 +08:00
90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
package leetcode
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
// 解法一
|
|
func wiggleSort(nums []int) {
|
|
if len(nums) < 2 {
|
|
return
|
|
}
|
|
median := findKthLargest324(nums, (len(nums)+1)/2)
|
|
n, i, left, right := len(nums), 0, 0, len(nums)-1
|
|
|
|
for i <= right {
|
|
if nums[indexMap(i, n)] > median {
|
|
nums[indexMap(left, n)], nums[indexMap(i, n)] = nums[indexMap(i, n)], nums[indexMap(left, n)]
|
|
left++
|
|
i++
|
|
} else if nums[indexMap(i, n)] < median {
|
|
nums[indexMap(right, n)], nums[indexMap(i, n)] = nums[indexMap(i, n)], nums[indexMap(right, n)]
|
|
right--
|
|
} else {
|
|
i++
|
|
}
|
|
}
|
|
}
|
|
|
|
func indexMap(index, n int) int {
|
|
return (1 + 2*index) % (n | 1)
|
|
}
|
|
|
|
func findKthLargest324(nums []int, k int) int {
|
|
if len(nums) == 0 {
|
|
return 0
|
|
}
|
|
return selection324(nums, 0, len(nums)-1, len(nums)-k)
|
|
}
|
|
|
|
func selection324(arr []int, l, r, k int) int {
|
|
if l == r {
|
|
return arr[l]
|
|
}
|
|
p := partition324(arr, l, r)
|
|
|
|
if k == p {
|
|
return arr[p]
|
|
} else if k < p {
|
|
return selection324(arr, l, p-1, k)
|
|
} else {
|
|
return selection324(arr, p+1, r, k)
|
|
}
|
|
}
|
|
|
|
func partition324(a []int, lo, hi int) int {
|
|
pivot := a[hi]
|
|
i := lo - 1
|
|
for j := lo; j < hi; j++ {
|
|
if a[j] < pivot {
|
|
i++
|
|
a[j], a[i] = a[i], a[j]
|
|
}
|
|
}
|
|
a[i+1], a[hi] = a[hi], a[i+1]
|
|
return i + 1
|
|
}
|
|
|
|
// 解法二
|
|
func wiggleSort1(nums []int) {
|
|
if len(nums) < 2 {
|
|
return
|
|
}
|
|
array := make([]int, len(nums))
|
|
copy(array, nums)
|
|
sort.Ints(array)
|
|
n := len(nums)
|
|
left := (n+1)/2 - 1 // median index
|
|
right := n - 1 // largest value index
|
|
for i := 0; i < len(nums); i++ {
|
|
// copy large values on odd indexes
|
|
if i%2 == 1 {
|
|
nums[i] = array[right]
|
|
right--
|
|
} else { // copy values decremeting from median on even indexes
|
|
nums[i] = array[left]
|
|
left--
|
|
}
|
|
}
|
|
}
|