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)

 

posted on 2018-10-18 20:12  Sempron2800+  阅读(130)  评论(0编辑  收藏  举报