658 找到 K 個最接近的元素

2021-10-08 05:00:58 字數 1366 閱讀 6714

題目描述:

給定乙個排序好的陣列,兩個整數 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,...