2021-11-05:摆动排序 II。给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。你可以假设所有输入数组都可以
2021-11-05:摆动排序 II。给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。你可以假设所有输入数组都可以得到满足题目要求的结果。力扣324。
福大大 答案2021-11-05:
需要了解快排和完美洗牌问题。
时间复杂度:O(N)。
空间复杂度:O(1)。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math/rand"
)
func main() {
nums := []int{1, 5, 1, 1, 6, 4}
wiggleSort(nums)
fmt.Println(nums)
}
// 时间复杂度O(N),额外空间复杂度O(1)
func wiggleSort(nums []int) {
if len(nums) < 2 {
return
}
N := len(nums)
// 小 中 右
findIndexNum(nums, 0, len(nums)-1, N/2)
if (N & 1) == 0 {
// R L -> L R
shuffle(nums, 0, len(nums)-1)
// R1 L1 R2 L2 R3 L3 R4 L4
// L4 R4 L3 R3 L2 R2 L1 R1 -> 代码中的方式,可以的!
// L1 R1 L2 R2 L3 R3 L4 R4 -> 课上的分析,是不行的!不能两两交换!
reverse(nums, 0, len(nums)-1)
// 做个实验,如果把上一行的code注释掉(reverse过程),然后跑下面注释掉的for循环代码
// for循环的代码就是两两交换,会发现对数器报错,说明两两交换是不行的, 必须整体逆序
// for (int i = 0; i < nums.length; i += 2) {
// swap(nums, i, i + 1);
// }
} else {
shuffle(nums, 1, len(nums)-1)
}
}
func findIndexNum(arr []int, L int, R int, index int) int {
pivot := 0
var range2 []int
for L < R {
//pivot = arr[L+(int)(Math.random()*(R-L+1))]
pivot = arr[L+rand.Intn(R-L+1)]
range2 = partition(arr, L, R, pivot)
if index >= range2[0] && index <= range2[1] {
return arr[index]
} else if index < range2[0] {
R = range2[0] - 1
} else {
L = range2[1] + 1
}
}
return arr[L]
}
func partition(arr []int, L int, R int, pivot int) []int {
less := L - 1
more := R + 1
cur := L
for cur < more {
if arr[cur] < pivot {
less++
//swap(arr, ++less, cur++);
arr[less], arr[cur] = arr[cur], arr[less]
cur++
} else if arr[cur] > pivot {
more--
//swap(arr, cur, --more);
arr[more], arr[cur] = arr[cur], arr[more]
} else {
cur++
}
}
return []int{less + 1, more - 1}
}
func shuffle(nums []int, l int, r int) {
for r-l+1 > 0 {
lenAndOne := r - l + 2
bloom := 3
k := 1
for bloom <= lenAndOne/3 {
bloom *= 3
k++
}
m := (bloom - 1) / 2
mid := (l + r) / 2
rotate(nums, l+m, mid, mid+m)
cycles(nums, l-1, bloom, k)
l = l + bloom - 1
}
}
func cycles(nums []int, base int, bloom int, k int) {
for i, trigger := 0, 1; i < k; i, trigger = i+1, trigger*3 {
next := (2 * trigger) % bloom
cur := next
record := nums[next+base]
tmp := 0
nums[next+base] = nums[trigger+base]
for cur != trigger {
next = (2 * cur) % bloom
tmp = nums[next+base]
nums[next+base] = record
cur = next
record = tmp
}
}
}
func rotate(arr []int, l int, m int, r int) {
reverse(arr, l, m)
reverse(arr, m+1, r)
reverse(arr, l, r)
}
func reverse(arr []int, l int, r int) {
for l < r {
arr[l], arr[r] = arr[r], arr[l]
l++
r--
}
}
执行结果如下:

2021-11-05:摆动排序 II。给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。你可以假设所有输入数组都可以的更多相关文章
- Leetcode 324.摆动排序II
摆动排序II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...
- Java实现 LeetCode 324 摆动排序 II
324. 摆动排序 II 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]- 的顺序. 示例 1: 输入: n ...
- 2021.11.05 eleveni的水省选题的记录
2021.11.05 eleveni的水省选题的记录 因为eleveni比较菜,但是eleveni不想写绿题(总不能说是被绿题虐得不想写),eleveni决定继续水noip原题. --实际上菜菜的el ...
- [LeetCode] 324. Wiggle Sort II 摆动排序 II
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- 324. 摆动排序 II(三路划分算法)
题目: 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [ ...
- LeetCode——324. 摆动排序 II
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums = [1, 5 ...
- 324 Wiggle Sort II 摆动排序 II
给定一个无序的数组nums,将它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的顺序.例子:(1) 给定nums = [1, 5, 1, ...
- [Leetcode] 第324题 摆动排序II
一.题目描述 给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序. 示例 1: 输入: nums ...
- leetcode324 摆动排序II
1. 首先考虑排序后交替插入 首尾交替插入,这种方法对于有重复数字的数组不可行: class Solution { public: void wiggleSort(vector<int> ...
- [Swift]LeetCode324. 摆动排序 II | Wiggle Sort II
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
随机推荐
- debian 系统中安装中文输入法
debian wiki 中关于此主题的文档 :https://wiki.debian.org/InputMethodBuster 在图形界面选择 gnome,输入法程序选择 ibus 的情况下,配置较 ...
- python创建线程传参误区记录
创建线程可以使用threading模块中的Thread子类: 其中Thread子类允许的参数如下: (self, group=None, target=None, name=None, args=() ...
- CSAPP-Data Lab
gcc -O1 -Wall -m32 -lm -o btest bits.c btest.c decl.c tests.c In file included from btest.c:16:0: /u ...
- MySQL相关优质文章推荐
MySQL相关优质文章推荐 文章推荐 文章链接地址 MySQL高性能优化系列 MySQL字符集及校对规则的理解 MySQL InnoDB锁机制全面解析分享 MySQL事务隔离级别和MVCC,MVCC文 ...
- 浅谈ChatGPT如何取代前端开发工程师
1.ChatGPT 是什么? ChatGPT 是一种基于深度学习的自然语言处理技术,它可以生成高质量的自然语言文本.该技术是由 OpenAI 团队 开发,旨在使计算机能够像人类一样理解和产生自然语言. ...
- python入门教程之二十四Python MySQL - mysql-connector 驱动
MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读我们的 MySQL 教程. 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql ...
- python入门教程之十二Open及file操作
读和写文件 open() 将会返回一个 file 对象,基本语法格式如下: open(filename, mode) filename:包含了你要访问的文件名称的字符串值. mode:决定了打开文件的 ...
- [MYSQL/JDBC]mysql-connector-java与MySQL、JDK对应的兼容版本[转载]
1 文由 MYSQL 数据库版本 与 驱动版本之间的兼容性,可能会涉及到 部分数据库特性(函数.语法)等是否能够正常使用的问题. 2 兼容性: mysql-connector-java VS Mysq ...
- [灾备]独立磁盘阵列(RAID)技术
本文是对3个月前临时出差前往客户现场,安装交付我司大数据产品时使用的一项硬件级的灾备技术的简要复盘. 1 独立磁盘阵列--RAID:概述 1.1 定义 RAID := Redundant Arrays ...
- LeeCode数组问题(二)
LeeCode 977:有序数组的平方 题目描述: 给你一个按非递减顺序排列的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 标签:数组,首尾指针,最大值优先 时间复杂度: ...