Advertisement
1988coder

973. K Closest Points to Origin

Feb 2nd, 2019
918
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.92 KB | None | 0 0
  1.  
  2. // LeetCode URL: https://leetcode.com/problems/k-closest-points-to-origin/
  3. import java.util.Arrays;
  4. import java.util.Iterator;
  5. import java.util.PriorityQueue;
  6. import java.util.Random;
  7.  
  8. /**
  9.  * Using Priority Queue
  10.  *
  11.  * Priority Queue will maintain k closest points.
  12.  *
  13.  * Time Complexity: O(N log K)
  14.  *
  15.  * Space Complexity: O(K)
  16.  *
  17.  * N = Lenght of the input array. K = input K.
  18.  */
  19. class Solution1 {
  20.     public int[][] kClosest(int[][] points, int K) {
  21.         if (points == null || points.length == 0 || K <= 0) {
  22.             return new int[0][0];
  23.         }
  24.         if (K >= points.length) {
  25.             return points;
  26.         }
  27.  
  28.         PriorityQueue<int[]> queue = new PriorityQueue<>(K + 1, (a, b) -> (distance(b) - distance(a)));
  29.  
  30.         for (int[] p : points) {
  31.             queue.offer(p);
  32.  
  33.             if (queue.size() > K) {
  34.                 queue.poll();
  35.             }
  36.         }
  37.  
  38.         int[][] result = new int[K][2];
  39.  
  40.         Iterator<int[]> itr = queue.iterator();
  41.         int i = 0;
  42.         while (itr.hasNext()) {
  43.             result[i++] = itr.next();
  44.         }
  45.  
  46.         return result;
  47.     }
  48.  
  49.     private int distance(int[] point) {
  50.         return point[0] * point[0] + point[1] * point[1];
  51.     }
  52. }
  53.  
  54. /**
  55.  * Using Kth smalled element algorithm (Quick Select)
  56.  *
  57.  * Time Complexity: Best Case -> O(N). Worst Case -> O(N^2).
  58.  *
  59.  * Space Complexity: O(1)
  60.  *
  61.  * N = Lenght of the input array.
  62.  */
  63. class Solution2 {
  64.     public int[][] kClosest(int[][] points, int K) {
  65.         if (points == null || points.length == 0 || K <= 0) {
  66.             return new int[0][0];
  67.         }
  68.  
  69.         int len = points.length;
  70.         if (K >= len) {
  71.             return points;
  72.         }
  73.  
  74.         int left = 0;
  75.         int right = len - 1;
  76.  
  77.         while (left < right) {
  78.             int pivot = partition(points, left, right);
  79.             if (K == pivot) {
  80.                 return Arrays.copyOfRange(points, 0, K);
  81.             }
  82.  
  83.             if (K < pivot) {
  84.                 right = pivot - 1;
  85.             } else {
  86.                 left = pivot + 1;
  87.             }
  88.         }
  89.         return Arrays.copyOfRange(points, 0, left);
  90.     }
  91.  
  92.     private int partition(int[][] points, int l, int r) {
  93.         int pivot = l;
  94.         int k = pivot;
  95.         l++;
  96.  
  97.         while (l <= r) {
  98.             if (distance(points[l]) <= distance(points[pivot])) {
  99.                 k++;
  100.                 if (k != l) {
  101.                     swap(points, k, l);
  102.                 }
  103.             }
  104.             l++;
  105.         }
  106.  
  107.         swap(points, k, pivot);
  108.         return k;
  109.     }
  110.  
  111.     private int distance(int[] point) {
  112.         return point[0] * point[0] + point[1] * point[1];
  113.     }
  114.  
  115.     private void swap(int[][] points, int i, int j) {
  116.         int[] temp = points[i];
  117.         points[i] = points[j];
  118.         points[j] = temp;
  119.     }
  120. }
  121.  
  122. /**
  123.  * Using Kth smalled element algorithm (Quick Select with Suffle)
  124.  *
  125.  * This algorithm shuffles the input array. It uses Fisher–Yates shuffle
  126.  * algorithm (https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)
  127.  *
  128.  * Time Complexity: Best Case -> O(N). Worst Case -> O(N^2).
  129.  *
  130.  * Space Complexity: O(1)
  131.  *
  132.  * N = Lenght of the input array.
  133.  */
  134. class Solution3 {
  135.     public int[][] kClosest(int[][] points, int K) {
  136.         if (points == null || points.length == 0 || K <= 0) {
  137.             return new int[0][0];
  138.         }
  139.  
  140.         int len = points.length;
  141.         if (K >= len) {
  142.             return points;
  143.         }
  144.  
  145.         shuffle(points);
  146.  
  147.         int left = 0;
  148.         int right = len - 1;
  149.  
  150.         while (left < right) {
  151.             int pivot = partition(points, left, right);
  152.             if (K == pivot) {
  153.                 return Arrays.copyOfRange(points, 0, K);
  154.             }
  155.  
  156.             if (K < pivot) {
  157.                 right = pivot - 1;
  158.             } else {
  159.                 left = pivot + 1;
  160.             }
  161.         }
  162.         return Arrays.copyOfRange(points, 0, left);
  163.     }
  164.  
  165.     private int partition(int[][] points, int l, int r) {
  166.         int pivot = l;
  167.         int k = pivot;
  168.         l++;
  169.  
  170.         while (l <= r) {
  171.             if (distance(points[l]) <= distance(points[pivot])) {
  172.                 k++;
  173.                 if (k != l) {
  174.                     swap(points, k, l);
  175.                 }
  176.             }
  177.             l++;
  178.         }
  179.  
  180.         swap(points, k, pivot);
  181.         return k;
  182.     }
  183.  
  184.     private int distance(int[] point) {
  185.         return point[0] * point[0] + point[1] * point[1];
  186.     }
  187.  
  188.     private void swap(int[][] points, int i, int j) {
  189.         int[] temp = points[i];
  190.         points[i] = points[j];
  191.         points[j] = temp;
  192.     }
  193.  
  194.     private void shuffle(int[][] points) {
  195.         Random rand = new Random();
  196.         for (int i = 1; i < points.length; i++) {
  197.             int idx = rand.nextInt(i + 1);
  198.             if (idx != i) {
  199.                 swap(points, idx, i);
  200.             }
  201.         }
  202.     }
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement