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]... ...
随机推荐
- linux查看mac地址
1. ip addr show (ip address show .ip addr ) 查看本机ip和额外的一些信息 2.ifconfig -a 其中 HWaddr 就是mac地址 3.cat /s ...
- Django视图中的请求与响应
一 请求 一 限制http请求 视图中的request,实际上是django源码中的HTTPRequest的子类WSGIRequest类的实例对象,主要由django对客户端请求的http协议报文进行 ...
- 【SpringBoot】还不会SpringBoot项目模块分层?来这手把手教你
前言 缘由 经常看到网上很多优秀的开源项目中,代码简洁,模块分层完美.反观自己代码层级混乱,,却不知如何整理分层.此文手把手教你一步一步创建模块,左手右手一个慢动作.结合本人实际开发及个人项目中分层思 ...
- 基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注.记录和保存病害位置和类型,辅助作物病害防治以增加产值.本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介 ...
- 程序员必须掌握的java进制转换(全网最详细讲解)
前言 在上一篇文章中,壹哥给大家讲了Java里的各种运算符.其中在讲解位运算符时,我给大家提到了计算机中进制的概念.但是现在很多小白同学,对进制的概念还不够了解,比如二进制.八进制.十六进制都是怎么回 ...
- MapReduce之简单的数据清洗----课堂测试
今天的课堂测试第一步是做简单的数据清洗,直到现在我才知道只是把文本文件的数据改成相应的格式,而我做的一直是寻找一条数据,并转换成相应的格式,但是呢,我感觉还是很高兴的,虽然没有按时完成任务,但也学到了 ...
- Duplicate File Finder Pro - 重复文件查找器,给你的 Mac 清理出大量磁盘空间
重复文件查找器 Duplicate File Finder Pro 是一个实用程序,只需3次点击就能在Mac上找到重复的文件.拖放功能和尽可能多的文件夹,你想,然后按下扫描按钮.在一分钟,应用程序将给 ...
- Go语言:编写一个 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL。如果两个 URL 在 10 秒内都未返回结果,返回一个 error。
问题: 你被要求编写一个叫做 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL.如果两个 URL 在 10 秒内都未返回结果,那么应该返回一个 error ...
- VUE2.x原理之Object.defineProperty()
Object.defineProperty()语法说明 Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性 Object.defineP ...
- JS一切皆对象理解
对象都是通过函数创建的 function Fn() { this.name = '王福朋'; this.year = 1988; } var fn1 = new Fn(); fn1是个对象,它是由函数 ...