【Lintcode】1623. Minimal Distance In The Array

题目地址:

https://www.lintcode.com/problem/minimal-distance-in-the-array/description

给定两个数组 A A A B B B,要求返回一个与 B B B同长的数组 C C C,使得 C [ i ] C[i] C[i] A A A中离 B [ i ] B[i] B[i]最近的数字。如果答案不唯一,则返回较小的那个。

思路是排序 + 二分。先对 A A A排序,然后对每个 B [ i ] B[i] B[i]找到距离其最近的数,可以先用二分找到比它小的最大的数,比如说是 A [ k ] A[k] A[k],再比较一下 A [ k + 1 ] A[k+1] A[k+1]是不是离得更近。代码如下:

import java.util.Arrays;

public class Solution {
    /**
     * @param a: array a
     * @param b: the query array
     * @return: Output an array of length `b.length` to represent the answer
     */
    public int[] minimalDistance(int[] a, int[] b) {
        // Write your code here
        int[] res = new int[b.length];
        
        Arrays.sort(a);
        for (int i = 0; i < b.length; i++) {
            res[i] = binarySearch(a, b[i]);
        }
        
        return res;
    }
    
    private int binarySearch(int[] a, int target) {
        int l = 0, r = a.length - 1;
        while (l < r) {
            int m = l + (r - l + 1 >> 1);
            if (a[m] <= target) {
                l = m;
            } else {
                r = m - 1;
            }
        }
        
        // 如果a[l + 1]离得更近则返回a[l + 1],否则返回a[l]
        if (l + 1 < a.length && a[l + 1] - target < target - a[l]) {
            return a[l + 1];
        } else {
            return a[l];
        }
    }
}

时间复杂度 O ( ( l A + l B ) log ⁡ l A ) O((l_A+l_B)\log l_A) O((lA+lB)loglA),空间 O ( 1 ) O(1) O(1)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页