Skip to content

Latest commit

 

History

History
79 lines (64 loc) · 2.23 KB

File metadata and controls

79 lines (64 loc) · 2.23 KB

##Find K Closest Elements Given a target number, a non-negative integer k and an integer array A sorted in ascending order, find the k closest numbers to target in A, sorted in ascending order by the difference between the number and target. Otherwise, sorted in ascending order by number if the difference is same.

##Example Given A = [1, 2, 3], target = 2 and k = 3, return [2, 1, 3].

Given A = [1, 4, 6, 8], target = 3 and k = 3, return [4, 1, 6].

##Challenge O(logn + k) time complexity.

##Notice The value k is a non-negative integer and will always be smaller than the length of the sorted array. Length of the given array is positive and will not exceed 10^4 Absolute value of elements in the array and x will not exceed 10^4

##思路

  • 找到最近接的两个,其中一个可以等于target
  • 然后两根指针比较,左边的左移,右边的右移,注意左右不要越界,如果左边到达了0,那么就全部添加右边的,反之一样
public class Solution {
    /**
     * @param A: an integer array
     * @param target: An integer
     * @param k: An integer
     * @return: an integer array
     */
    public int[] kClosestNumbers(int[] A, int target, int k) {
        // write your code here
        
        if (A.length == 0) {
            return new int[0];
        }
        
        int[] result = new int[k];
        int start = 0;
        int end = A.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (A[mid] > target) {
                end = mid;
            } else {
                start = mid;
            }
        }
        
        for (int i = 0; i < k; i++) {
            
            if (start < 0) {
                result[i] = A[end];
                end++;
                continue;
            }
            
            if (end > A.length - 1) {
                result[i] = A[start];
                start--;
                continue;
            }
            
            if (Math.abs(A[start] - target) <= Math.abs(A[end] - target)) {
                result[i] = A[start];
                start--;
            } else {
                result[i] = A[end];
                end++;
            }
        }
        
        return result;
    }
}