截图_20215615095658.png

时间复杂度O(N*logN)

  • 解题思路

数组按照从小到大排序后,从中间切分,比如 123456 切分后123,456 穿插进行后142536符合题意
但是1223这种就不行了,但是穿插规则可以变一下,两部分逆序穿插,即2 3 1 2

  1. public void wiggleSort(int[] nums) {
  2. int[] help = nums.clone();
  3. Arrays.sort(help);
  4. int N = nums.length;
  5. for (int i = 1; i < nums.length ; i+=2) {
  6. nums[i] = help[--N];
  7. }
  8. for (int i = 0; i < nums.length; i+=2) {
  9. nums[i] = help[--N];
  10. }
  11. }

时间复杂度O(N) 空间复杂度O(1)

  • 怎么额外空间复杂度O(1), 时间复杂度O(N)找到数组的中位数?
  • 然后小于中位数的放左边,等于中位数的放中间,大于中位数的放右边
  • 若数组是偶数长度

image.png

  • 用完美洗牌问题搞

image.png

  • 若数组长度是奇数, 0位置的数不动,剩下的数去完美洗牌

image.png