leetcode 324 Wiggle Sort 2
利用中位数的概念,中位数就是将一组数分成2等份(若为奇数,则中位数既不属于左也不属于右,所以是2等份),其一组数中任何一个元素都大于等于另一组数
那么我们是不是只要一左一右配合着插入,就保证了差值+-+-+-的要求?
由于题目输入限制了,必定存在解,所以此处我们不需要担心如果重复中位数太多,出现一左一右相等的情况
算法步骤:
1)找到中位数
利用lc215 Kth Largest...,将k=(nums.length+1) / 2,可以在o(n)内求出中位数
2)一左一右插入
0 2 4 .. 插大于中位数的
1 3 5 .. 插小于中位数的
考虑到中位数可能有重复的情况
我们从后往前插入小于中位数的值
从前往后插入大于中位数的值
剩下的空位补上中位数
代码中为了省事找中位数的部分用的o(klogn)的方法,详情可以看之前博客
class Solution {
public void wiggleSort(int[] nums) {
int median = findKthLargest(nums, (nums.length+1) / 2);
int left = 1;
int right = nums.length % 2 == 0 ? nums.length-2 : nums.length-1;
int[] tmp = new int[nums.length];
for(int i=0; i<nums.length; i++){
if(nums[i] > median){
tmp[left] = nums[i];
left += 2;
}else if(nums[i] < median){
tmp[right] = nums[i];
right -= 2;
}
}
while(left < nums.length){
tmp[left] = median;
left += 2;
}
while(right >= 0){
tmp[right] = median;
right -= 2;
}
System.arraycopy(tmp, 0, nums, 0, nums.length);
}
public int findKthLargest(int[] nums, int k) {
if(nums.length == 0)
return 0;
PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());
int res = 0;
for(int num : nums)
pq.offer(num);
while(k != 0){
res = pq.poll();
k--;
}
return res;
}
}
leetcode 324 Wiggle Sort 2的更多相关文章
- [LeetCode] 324. Wiggle Sort II 摆动排序 II
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
- leetcode 280.Wiggle Sort 、324. Wiggle Sort II
Wiggle Sort: 注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求. 解法一错误版本: 如果nums的长度是4,这种情况下nums[i+1]会越界.但是如果你用 ...
- LeetCode 280. Wiggle Sort (摆动排序)$
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- [LeetCode] 280. Wiggle Sort 摆动排序
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- Leetcode 280. Wiggle Sort
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- 324 Wiggle Sort II 摆动排序 II
给定一个无序的数组nums,将它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的顺序.例子:(1) 给定nums = [1, 5, 1, ...
- 324. Wiggle Sort II
这个题真是做得我想打人了.我生起气来连自己都打. 一开始quick select没啥可说的.但是in place把老命拼了都没想出来.. 看网上的答案是3 partition,MAP式子一看就由衷地反 ...
- LeetCode 280. Wiggle Sort C#
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...
- [LeetCode] Wiggle Sort II 摆动排序
Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...
随机推荐
- [JZOJ6347] 【NOIP2019模拟2019.9.8】ZYB玩字符串
题目 题目大意 有一个字符串\(p\).一开始字符串\(s\)为空串. 接下来进行若干次操作:在\(s\)的某个空隙中插入\(p\). 给出操作后的\(s\),问长度最小的\(p\). 思考历程 感觉 ...
- jQuery ajax - post() 方法
实例 请求 test.php 网页,忽略返回值: $.post("test.php"); TIY 实例 通过 AJAX POST 请求改变 div 元素的文本: $("i ...
- Hibernate之OID
在关系数据库中,主键用来识别记录,并保证每天记录的唯一性.在Java语言中,通过比较两个变量所引用对象的内存地址是否相同,或者比较两变量引用的对象是否相等.Hibernate为了解决两者之间的不同,使 ...
- k8s常用的资源
1. 创建pod资源 pod是最小的资源单位 任何一个k8s资源都可以有yml清单文件来定义 k8s yaml的主要组成 apiVersion: v1 api版本 kind: pod 资源类型 met ...
- pip的使用方法简介
pip是Python包管理工具,它提供了对Python包的查找.下载.安装.卸载的功能 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具. 以下是pip常用命令 显示版本 ...
- appium基础一:连接手机和appium-desktop定位元素
一.获取手机信息 adb devices获取手机或模拟器的设备名 aapt dump badging xxxx.apk获取app的包名.入口等基本信息 如果想要知道手机原生携带的app的基本信息,首先 ...
- js 调用接口并传参
注:需先引入 jquery.json-xx.min.js 1. 参数跟在url后面 var name = '王一'; var age = 18; $.ajax({ type : 'get', url ...
- js 实现加载百分比效果
效果: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- 设置Hadoop+Hbase集群pid文件存储位置
有时候,我们对运行几天或者几个月的hadoop或者hbase集群做停止操作,会发现,停止命令不管用了,为什么呢? 因为基于java开发的程序,想要停止程序,必须通过进程pid来确定,而hadoop和h ...
- Oracle批量更改用户下表空间
--查询某个用户下的表,并生成一个修改其命名空间的批处理语句 select 'alter table '|| table_name ||' move tablespace 要迁入的表空间;' from ...