題目連接: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; } }