Lintcode阶梯训练~算法

在排序数组中找最接近的 K 个数

2017-07-05  本文已影响286人  lyoungzzz

描述

给一个目标数 target, 一个非负整数 k, 一个按照升序排列的数组 A。在 A 中找与 target 最接近的 k 个整数。返回这 k 个数并按照与 target 的接近程度从小到大排序,如果接近程度相当,那么小的数排在前面。

样例

如果 A = [1, 2, 3], target = 2 and k = 3, 那么返回 [2, 1, 3].
如果 A = [1, 4, 6, 8], target = 3 and k = 3, 那么返回 [4, 1, 6].

代码实现

public class Solution {
    /**
     * @param A an integer array
     * @param target an integer
     * @param k a non-negative integer
     * @return an integer array
     */
    public int[] kClosestNumbers(int[] A, int target, int k) {
        if (A == null || A.length == 0) {
            return A;
        }
        if (k > A.length) {
            return A;
        }
        int[] result = new int[k];
        
        int index = firstIndex(A, target);
        int left = index;
        int right = index+1;
        //双指针,两个反向指针
        for (int i = 0; i < k; i++) {
            //越界
            if (left < 0) {
                result[i] = A[right++];
            } else if (right >= A.length) {  //越界
                result[i] = A[left--];
            } else {
                if (target-A[left] <= A[right]-target) {
                    result[i] = A[left--];
                } else {
                    result[i] = A[right++];
                }
            }
        }
        return result;
    }
    //找到离target最近的索引
    private int firstIndex(int[] A, int target) {
        int start = 0;
        int end = A.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (A[mid] < target) {
                start = mid;
            } else {
                end = mid;
            }
        }
        if (target - A[start] <= A[end] - target) {
            return start;
        } 
        return end;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读