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

460 · 在排序数组中找最接近的K个数_第1张图片

 

LintCode 炼码

class Solution {
public:
    /**
     * @param a: an integer array
     * @param target: An integer
     * @param k: An integer
     * @return: an integer array
     */
    vector kClosestNumbers(vector &a, int target, int k) {
        if (a.size() <= 0) {
            return {};
        }
        // write your code here
        // 找到第一个大于等于target的位置
        int left = 0;
        int right = a.size()-1;
        while (left + 1 < right) {
            int mid = left + (right-left)/2;
            if (a[mid] > target) {
                right = mid;
            } else if (a[mid] == target) {
                right = mid;
            } else {
                // arr[mid] < target
                left = mid;
            }
        }
        int mid = left;
        if (a[left] >= target) {
            mid = left;
        } else {
            mid = right;
        }
        //cout << mid << endl;
        // 归并排序
        int b1 = mid-1;
        // b2 这个位置一定>=target
        int b2 = mid;
        std::vector result;
        while (b1 >= 0 && b2 < a.size() && k > 0) {
            // 取差值小的数字
            if (abs(target - a[b1]) < abs(target-a[b2])) {
                result.push_back(a[b1]);
                --b1;
            } else {
                // 相等的取数字小的
                if (abs(target - a[b1]) == abs(target-a[b2])) {
                    if (a[b1] < a[b2]) {
                        result.push_back(a[b1]);
                        --b1;
                    }
                } else {
                    result.push_back(a[b2]);
                    ++b2;
                }
            }
            --k;
        }
        // 归并剩余的数字
        if (b1 >= 0) {
            while (b1 >= 0 && k >0) {
                result.push_back(a[b1]);
                --b1;
                --k;
            }
        }
        if (b2 < a.size()) {
            while (b2 < a.size() && k > 0) {
                result.push_back(a[b2]);
                ++b2;
                --k;
            }
        }
        return result;
    }
};

你可能感兴趣的:(leetcode,算法)