题目连接:https://leetcode.com/problems...数组
这道题容许等号,相对简单,有两种方法:1. sort而后交换奇数位和它下一位的元素,2. 不知足条件的时候直接交换app
能够用递推来讲明一下这么作的正确性:ui
假设到第i位以前都知足题目要求的关系code
如今比较第i位和第i+1位element
if i == odd:leetcode
nums[i] >= nums[i+1],到i+1位都知足条件get
nums[i] < nums[i+1],swap(i, i+1),新的nums[i] >= nums[i+1] >= nums[i-1],因此到i+1都知足条件it
if i == even:io
同理class
一直递推到len(nums),因此整个数组都知足条件
public class Solution { public void wiggleSort(int[] nums) { /* condition: nums[odd] >= nums[even] * 1. sort => [1, 2, 3, 4, 5, 6] => swap(i, i+1) * 2. swap if a. nums[i] < nums[i+1] i = odd * b. nums[i] > nums[i+1] i = even */ for(int i = 0; i < nums.length - 1; i++) { if(i % 2 == 1 && nums[i] < nums[i+1]) swap(nums, i, i+1); if(i % 2 == 0 && nums[i] > nums[i+1]) swap(nums, i, i+1); } } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
题目连接:https://leetcode.com/problems...
这题不能有等号,并且要求O(N)的时间和O(1)的空间,那么感受只能quick select了。若是没复杂度的要求,先sort也能够,再交叉放入数字也能够。交叉的时候注意是按照[2, 0, 3, 1],降序的。
public class Solution { public void wiggleSort(int[] nums) { /* quick select: find the middle element * 3 way partitions: [h, l, ...] * [2, 0, 3, 1], [2, 0, 3, 1, 4] */ n = nums.length; int mid = quickSelect(nums, 0, nums.length - 1, nums.length / 2); partition(nums, 0, nums.length - 1, mid); } int n; private void partition(int[] nums, int l, int r, int mid) { int i = l; while(i <= r) { if(nums[mapping(i)] > mid) swap(nums, mapping(i++), mapping(l++)); else if(nums[mapping(i)] < mid) swap(nums, mapping(i), mapping(r--)); else i++; } } private int mapping(int i) { return (2 * i + 1) % (n | 1); } private int quickSelect(int[] nums, int l, int r, int k) { if(l >= r) return nums[l]; int pivot = nums[r]; int index = l; for(int i = l; i < r; i++) { if(nums[i] < pivot) swap(nums, i, index++); } // swap the pivot to the correct position swap(nums, index, r); if(index == k) return nums[index]; else if(index < k) return quickSelect(nums, index + 1, r, k); else return quickSelect(nums, l, index - 1, k); } private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }