Advertisement
1988coder

324. Wiggle Sort II

Dec 25th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.03 KB | None | 0 0
  1.  
  2. // LeetCode URL: https://leetcode.com/problems/wiggle-sort-ii/
  3. import java.util.Random;
  4.  
  5. /**
  6.  * Refer:
  7.  * https://leetcode.com/problems/wiggle-sort-ii/discuss/77682/Step-by-step-explanation-of-index-mapping-in-Java/81849
  8.  *
  9.  * Time Complexity: Best Case O(N). Worst case O(N^2) -- This is due to
  10.  * partition function.
  11.  *
  12.  * Space Complexity: O(N)
  13.  */
  14. class Solution1 {
  15.     public void wiggleSort(int[] nums) throws IllegalArgumentException {
  16.         if (nums == null) {
  17.             throw new IllegalArgumentException("Input nums array is null.");
  18.         }
  19.         int len = nums.length;
  20.         if (len < 2) {
  21.             return;
  22.         }
  23.  
  24.         int median = findKthLargest(nums, (len + 1) / 2);
  25.         int[] tempArr = new int[len];
  26.         int odd = 1;
  27.         int even = len % 2 == 0 ? len - 2 : len - 1;
  28.  
  29.         for (int i = 0; i < len; i++) {
  30.             if (nums[i] > median) {
  31.                 tempArr[odd] = nums[i];
  32.                 odd += 2;
  33.             } else if (nums[i] < median) {
  34.                 tempArr[even] = nums[i];
  35.                 even -= 2;
  36.             }
  37.         }
  38.         while (odd < nums.length) {
  39.             tempArr[odd] = median;
  40.             odd += 2;
  41.         }
  42.         while (even >= 0) {
  43.             tempArr[even] = median;
  44.             even -= 2;
  45.         }
  46.  
  47.         for (int i = 0; i < len; i++) {
  48.             nums[i] = tempArr[i];
  49.         }
  50.     }
  51.  
  52.     private int findKthLargest(int[] nums, int k) {
  53.         shuffle(nums);
  54.  
  55.         int left = 0;
  56.         int right = nums.length - 1;
  57.         k = nums.length - k;
  58.  
  59.         while (left < right) {
  60.             int pivot = partition(nums, left, right);
  61.             if (k == pivot) {
  62.                 return nums[k];
  63.             }
  64.             if (k < pivot) {
  65.                 right = pivot - 1;
  66.             } else {
  67.                 left = pivot + 1;
  68.             }
  69.         }
  70.  
  71.         return nums[left];
  72.     }
  73.  
  74.     private void shuffle(int[] nums) {
  75.         Random random = new Random();
  76.         for (int i = nums.length - 1; i > 0; i--) {
  77.             int r = random.nextInt(i + 1);
  78.             swap(nums, r, i);
  79.         }
  80.     }
  81.  
  82.     private int partition(int[] nums, int l, int r) {
  83.         int pivot = l;
  84.         int k = pivot;
  85.         l++;
  86.  
  87.         while (l <= r) {
  88.             if (nums[l] >= nums[pivot]) {
  89.                 k++;
  90.                 if (k != l) {
  91.                     swap(nums, k, l);
  92.                 }
  93.             }
  94.             l++;
  95.         }
  96.  
  97.         swap(nums, k, pivot);
  98.         return k;
  99.     }
  100.  
  101.     private void swap(int[] nums, int i, int j) {
  102.         int temp = nums[i];
  103.         nums[i] = nums[j];
  104.         nums[j] = temp;
  105.     }
  106. }
  107.  
  108. /*
  109.  * Using 3-way partitioning and virtual indexing. Refer: 1)
  110.  * https://leetcode.com/problems/wiggle-sort-ii/discuss/77677/O(n)+O(1)-after-
  111.  * median-Virtual-Indexing 2)
  112.  * https://leetcode.com/problems/wiggle-sort-ii/discuss/77682/Step-by-step-
  113.  * explanation-of-index-mapping-in-Java
  114.  *
  115.  * Time Complexity: Best Case O(N). Worst case O(N^2) -- This is due to
  116.  * partition function.
  117.  *
  118.  * Space Complexity: O(1)
  119.  */
  120. class Solution2 {
  121.     public void wiggleSort(int[] nums) throws IllegalArgumentException {
  122.         if (nums == null) {
  123.             throw new IllegalArgumentException("Input nums array is null.");
  124.         }
  125.         int len = nums.length;
  126.         if (len < 2) {
  127.             return;
  128.         }
  129.  
  130.         int median = findKthLargest(nums, (len + 1) / 2);
  131.         int odd = 0;
  132.         int even = len - 1;
  133.         int i = 0;
  134.  
  135.         while (i <= even) {
  136.             if (nums[nextIdx(i, len)] > median) {
  137.                 swap(nums, nextIdx(odd, len), nextIdx(i, len));
  138.                 odd++;
  139.                 i++;
  140.             } else if (nums[nextIdx(i, len)] < median) {
  141.                 swap(nums, nextIdx(even, len), nextIdx(i, len));
  142.                 even--;
  143.             } else {
  144.                 i++;
  145.             }
  146.         }
  147.     }
  148.  
  149.     private int nextIdx(int i, int n) {
  150.         return (1 + 2 * i) % (n | 1);
  151.     }
  152.  
  153.     private int findKthLargest(int[] nums, int k) {
  154.         int left = 0;
  155.         int right = nums.length - 1;
  156.         k = nums.length - k;
  157.  
  158.         while (left < right) {
  159.             int pivot = partition(nums, left, right);
  160.             if (k == pivot) {
  161.                 return nums[k];
  162.             }
  163.             if (k < pivot) {
  164.                 right = pivot - 1;
  165.             } else {
  166.                 left = pivot + 1;
  167.             }
  168.         }
  169.  
  170.         return nums[left];
  171.     }
  172.  
  173.     private int partition(int[] nums, int l, int r) {
  174.         int pivot = l;
  175.         int k = pivot;
  176.         l++;
  177.  
  178.         while (l <= r) {
  179.             if (nums[l] >= nums[pivot]) {
  180.                 k++;
  181.                 if (k != l) {
  182.                     swap(nums, k, l);
  183.                 }
  184.             }
  185.             l++;
  186.         }
  187.  
  188.         swap(nums, k, pivot);
  189.         return k;
  190.     }
  191.  
  192.     private void swap(int[] nums, int i, int j) {
  193.         int temp = nums[i];
  194.         nums[i] = nums[j];
  195.         nums[j] = temp;
  196.     }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement