Advertisement
goodwish

Hard 507. Wiggle Sort II

Dec 4th, 2019
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.91 KB | None | 0 0
  1. way 1: 排序, 然后交错, 从大到小排放. O(n log n) time
  2.  
  3. A.sort()
  4. res = [None] * n
  5. res[0::2] = A[0:mid][::-1]
  6. res[1::2] = A[mid:][::-1]
  7.  
  8. way 2: 找到中位数, quick select, O(n) time
  9.  
  10. 找到中位数 A[mid], 相当于排序后的 mid = n//2,
  11. - 全部填满中位数,解决中位数可能重复的问题.
  12. 小数从后往前摆放, 偶数, 指针 r = n - 2 (倒数第二个), 奇数: 指针 r = n - 1 (倒数第一个).
  13.  - 奇数个, i.e. 1 2 1, 小的在最后边.
  14.  - 偶数个, i.e. 1 2 1 2, 小的在倒数第二个, 大的在最后.
  15. 大数从前往后摆放, 指针从 l = 1 开始. - 从哪里开始, 太难了, 只能靠记忆.
  16. - i.e. 1 8 2 7, 大树从第二个开始, l = 1.
  17.  
  18. ```
  19. 2 3 5 5 7 8
  20. 5 7 2 8 3 5
  21. 偶数个, 7: l = 1, 3: r = n - 2
  22.  
  23. 2 3 5 5 5 7 8
  24. 5 8 5 7 3 5 2
  25. 奇数个, 8: l = 1, 2: r = n - 1.
  26. ```
  27.  
  28. # way 1: O(n log n)
  29.  
  30. class Solution:
  31.     def wiggleSort(self, A):
  32.         if not A or len(A) < 2:
  33.             return
  34.         # init
  35.         A.sort()
  36.         n = len(A)
  37.         res = [None] * n
  38.         mid_v = A[n//2]
  39.         if n & 1 == 1:
  40.             mid = n//2 + 1
  41.         else:
  42.             mid = n//2
  43.         res[0::2] = A[0:mid][::-1]
  44.         res[1::2] = A[mid:][::-1]
  45.         # print(res)
  46.         A[:] = res
  47.  
  48. A = [1, 3, 2, 2, 3, 1]
  49. # Output: [2, 3, 1, 3, 1, 2]
  50. ;
  51.  
  52. # way 2: O(n)
  53.  
  54. class Solution:
  55.     def wiggleSort(self, A):
  56.         if not A or len(A) < 2:
  57.             return
  58.         # init
  59.         A.sort()
  60.         n = len(A)
  61.         mid_v = A[n//2] # can do quick select, O(n)
  62.         res = [mid_v] * n
  63.         l = 1
  64.         if n & 1 == 1: # 奇数个, i.e. 1 2 1, 小的在最后边.
  65.             r = n - 1
  66.         else:
  67.             r = n - 2
  68.        
  69.         for v in A:
  70.             if v > mid_v:
  71.                 res[l] = v
  72.                 l += 2
  73.             elif v < mid_v:
  74.                 res[r] = v
  75.                 r -= 2
  76.  
  77.         A[:] = res
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement