All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0601_0700.s0658_find_k_closest_elements.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0601_0700.s0658_find_k_closest_elements;

// #Medium #Array #Sorting #Binary_Search #Two_Pointers #Heap_Priority_Queue #Binary_Search_II_Day_2
// #2022_03_21_Time_3_ms_(99.20%)_Space_44.1_MB_(88.25%)

import java.util.ArrayList;
import java.util.List;

/**
 * 658 - Find K Closest Elements\.
 *
 * Medium
 *
 * Given a **sorted** integer array `arr`, two integers `k` and `x`, return the `k` closest integers to `x` in the array. The result should also be sorted in ascending order.
 *
 * An integer `a` is closer to `x` than an integer `b` if:
 *
 * *   `|a - x| < |b - x|`, or
 * *   `|a - x| == |b - x|` and `a < b`
 *
 * **Example 1:**
 *
 * **Input:** arr = [1,2,3,4,5], k = 4, x = 3
 *
 * **Output:** [1,2,3,4] 
 *
 * **Example 2:**
 *
 * **Input:** arr = [1,2,3,4,5], k = 4, x = -1
 *
 * **Output:** [1,2,3,4] 
 *
 * **Constraints:**
 *
 * *   `1 <= k <= arr.length`
 * *   1 <= arr.length <= 104
 * *   `arr` is sorted in **ascending** order.
 * *   -104 <= arr[i], x <= 104
**/
public class Solution {
    public List findClosestElements(int[] arr, int k, int x) {
        int left = 0;
        int right = arr.length - k;
        List answer = new ArrayList<>();
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (x - arr[mid] > arr[mid + k] - x) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        for (int i = left; i < left + k; i++) {
            answer.add(arr[i]);
        }
        return answer;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy