【LeetCode/LintCode】 題解丨Google高頻面試題:在排序陣列中找最接近的K個數
阿新 • • 發佈:2020-09-09
給一個目標數 target, 一個非負整數 k, 一個按照升序排列的陣列 A。在A中找與target最接近的k個整數。返回這k個數並按照與target的接近程度從小到大排序,如果接近程度相當,那麼小的數排在前面。
- k是一個非負整數,並且總是小於已排序陣列的長度。
- 給定陣列的長度是正整數, 不會超過 10^4
- 陣列中元素的絕對值不會超過 10^4
線上評測地址:
樣例 1: 輸入: A = [1, 2, 3], target = 2, k = 3 輸出: [2, 1, 3] 樣例 2: 輸入: A = [1, 4, 6, 8], target = 3, k = 3 輸出: [4, 1, 6]
【題解】
直接在陣列中二分查詢 target, 如果不存在則返回大於 target 的最小的或者小於 target 的最大的元素均可.
然後使用兩根指標從該位置開始向兩端遍歷, 每次把差值比較小的元素放入答案中然後將該指標向邊界方向移動一下即可.
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) { int[] result = new int[k]; if (A == null || A.length == 0) { return A; } if (k > A.length) { return A; } int index = firstIndex(A, target); int start = index - 1; int end = index; for (int i = 0; i < k; i++) { if (start < 0) { result[i] = A[end++]; } else if (end >= A.length) { result[i] = A[start--]; } else { if (target - A[start] <= A[end] - target) { result[i] = A[start--]; } else { result[i] = A[end++]; } } } return result; } private int firstIndex(int[] A, int target) { int start = 0, end = A.length - 1; while (start + 1 < end) { int mid = start + (end - start) / 2; if (A[mid] < target) { start = mid; } else if (A[mid] > target) { end = mid; } else { end = mid; } } if (A[start] >= target) { return start; } if (A[end] >= target) { return end; } return A.length; } }
更多題解參考: