Untitled

 avatar
unknown
plain_text
13 days ago
2.3 kB
0
Indexable
import java.util.Random;

public class ClosestPointsQuickSelect {
    public static int[][] kClosest(int[][] points, int k) {
        quickSelect(points, 0, points.length - 1, k);
        int[][] result = new int[k][2];
        System.arraycopy(points, 0, result, 0, k); // Copy first k points
        return result;
    }

    private static void quickSelect(int[][] points, int left, int right, int k) {
        Random random = new Random();

        while (left <= right) {
            // Randomize pivot and partition the array
            int pivotIndex = left + random.nextInt(right - left + 1);
            swap(points, pivotIndex, right); // Move pivot to the end
            int partitionIndex = partition(points, left, right);

            // Check if we have found the k closest points
            if (partitionIndex == k - 1) {
                return; // The first k points are now closest to the origin
            } else if (partitionIndex < k - 1) {
                left = partitionIndex + 1; // Move to the right part
            } else {
                right = partitionIndex - 1; // Move to the left part
            }
        }
    }

    private static int partition(int[][] points, int left, int right) {
        int[] pivot = points[right];
        int pivotDist = squaredDistance(pivot);
        int i = left;

        for (int j = left; j < right; j++) {
            if (squaredDistance(points[j]) <= pivotDist) {
                swap(points, i, j);
                i++;
            }
        }

        swap(points, i, right); // Place pivot in its correct position
        return i;
    }

    private static int squaredDistance(int[] point) {
        return point[0] * point[0] + point[1] * point[1];
    }

    private static void swap(int[][] points, int i, int j) {
        int[] temp = points[i];
        points[i] = points[j];
        points[j] = temp;
    }

    public static void main(String[] args) {
        int[][] points = {{1, 3}, {-2, 2}, {5, 8}, {0, 1}};
        int k = 2;

        int[][] closest = kClosest(points, k);
        System.out.println("The " + k + " closest points to the origin are:");
        for (int[] point : closest) {
            System.out.println("[" + point[0] + ", " + point[1] + "]");
        }
    }
}
Leave a Comment