題目描述:
給定乙個排序好的陣列,兩個整數 k 和 x,從陣列中找到最靠近 x(兩數之差最小)的 k 個數。返回的結果必須要是按公升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。
示例 1:
輸入: [1,2,3,4,5], k=4, x=3
輸出: [1,2,3,4]
示例 2:
輸入: [1,2,3,4,5], k=4, x=-1
輸出: [1,2,3,4]
說明:
k 的值為正數,且總是小於給定排序陣列的長度。
陣列不為空,且長度不超過 104
陣列裡的每個元素與 x 的絕對值不超過 104
方法1:二分查詢+雙指標
主要思路:
(1)先使用二分查詢找出最接近數值 x 的位置;
(2)再以該位置為中心,向左右方向擴充套件範圍,知道數量滿足要求 k;
class
solution
if(x<=arr[0]
)//確定初始的搜尋範圍
int left=0;
int right=arr.
size()
-1;int mid=0;
//若範圍到剩餘乙個元素,既left==right的位置
while
(leftelse
if(arr[mid]
else
}//以找到的位置為中心,向前後兩個位置進行判斷,是否需要更新當前的中心位置
mid=right;
if(rightsize()
-1&&abs
(arr[mid]
-x)>
abs(arr[right+1]
-x))
mid=right+1;
if(left>0&&
abs(arr[mid]
-x)>=
abs(arr[left-1]
-x))
mid=left-1;
//以當前位置為中心,想前後擴充套件範圍,知道包含k個元素
left=mid-1;
right=mid+1;
//終止條件是範圍內有k個元素
while
(--k)
return vector<
int>
(arr.
begin()
+left+
1,arr.
begin()
+right)
;//返回邊界內的值}}
;
658找到K個最接近的元素
題目描述 給定乙個排序好的陣列,兩個整數 k 和 x,從陣列中找到最靠近 x 兩數之差最小 的 k 個數。返回的結果必須要是按公升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。示例 1 輸入 1 2,3 4,5 k 4,x 3輸出 1 2,3 4 示例 2 輸入 1 2,3 4...
658 找到K個最接近的元素
2020 03 10 找到 k 個最接近的元素 給定乙個排序好的陣列,兩個整數 k 和 x,從陣列中找到最靠近 x 兩數之 差最小 的 k 個數。返回的結果必須要是按公升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。說明 示例 輸入 1,2,3,4,5 k 4,x 3 輸出 1...
找到 K 個最接近的元素
題目 給定乙個排序好的陣列,兩個整數 k 和 x,從陣列中找到最靠近 x 兩數之差最小 的 k 個數。返回的結果必須要是按公升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。示例 1 輸入 1,2,3,4,5 k 4,x 3 輸出 1,2,3,4 示例 2 輸入 1,2,3,4,...