Java版本:先将数组排序,从中间将排好序的数组分为small部分和large部分。
每次从小区间找一个值插入偶数位,从大区间找一个值插入奇数位。
1 public void wiggleSort(int[] nums) { 2 int[] temp = Arrays.copyOfRange(nums, 0, nums.length); 3 Arrays.sort(temp); 4 //中间点,左侧都是小值 5 int small = temp.length / 2 + (temp.length % 2 == 0 ? -1 : 0); 6 //右侧都是大值 7 int large = temp.length - 1; 8 for (int i = 0, j = 1; i < temp.length; i += 2, j += 2) { 9 if (j < temp.length) { 10 //用大值插入odd位置 11 nums[j] = temp[large--]; 12 } 13 //用小值插入even位置 14 nums[i] = temp[small--]; 15 } 16 }
补充一个python的版本:
1 class Solution: 2 def wiggleSort(self, nums: 'List[int]') -> None: 3 temp = sorted(nums) 4 n = len(nums) 5 mid = n // 2 + n % 2 6 p1 = temp[:mid] 7 p2 = temp[mid:] 8 i = 0 9 j = 0 10 k = 0 11 while k < n: 12 if k % 2 == 0: 13 temp[k] = p1[i] 14 k += 1 15 i += 1 16 else: 17 temp[k] = p2[j] 18 k += 1 19 j += 1 20 print(temp) 21 for i in range(1,n): 22 if temp[i-1] == temp[i]: 23 nums.clear() 24 nums.extend(temp[i:]) 25 nums.extend(temp[:i]) 26 print(nums) 27 return 28 nums.clear() 29 nums.extend(temp)