324. Wiggle Sort II

Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]….

Example:
(1) Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6].
(2) Given nums = [1, 3, 2, 2, 3, 1], one possible answer is [2, 3, 1, 3, 1, 2].

Note:
You may assume all input has valid answer.

Follow Up:
Can you do it in O(n) time and/or in-place with O(1) extra space?

解法1: O(NlogN)

比较基本的解法就是先排序,然后就可以重新建一个数组,从前半部分去一个然后后半部分取一个交替进行。
要注意的是,因为array可能有重复的数字出现,所以不能从两边往当中,这样最后可能会碰到两个数字一样,比如[4,5,5,6]
这是需要注意的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public void wiggleSort(int[] nums) {
if (nums == null || nums.length <= 1) {
return;
}
Arrays.sort(nums);
int left = (nums.length - 1) / 2;
int right = nums.length - 1;
int[] temp = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
temp[i] = (i % 2 == 0) ? nums[left--] : nums[right--];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = temp[i];
}
return;
}
}

Follow up: O(N), virtual indexing

这个还没看懂。。。