leetcode 658.找到K個最接近的元素 Java
題目連結
https://leetcode-cn.com/problems/find-k-closest-elements/
描述
給定一個排序好的陣列,兩個整數 k 和 x,從陣列中找到最靠近 x(兩數之差最小)的 k 個數。返回的結果必須要是按升序排好的。如果有兩個數與 x 的差值一樣,優先選擇數值較小的那個數。
說明:
k 的值為正數,且總是小於給定排序陣列的長度。
陣列不為空,且長度不超過 104
陣列裡的每個元素與 x 的絕對值不超過 104
更新(2017/9/19):
這個引數 arr 已經被改變為一個整數陣列(而不是整數列表)。 請重新載入程式碼定義以獲取最新更改。
示例
示例 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]
初始程式碼模板
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
}
}
程式碼
這個題目,相當棒!
寫了半天,也就擊敗50%,一開始是用二分查詢確定元素位置,然後再用雙指標新增元素。
以下是我寫的,效率並不是很高,建議直接看第二個,我是為了給自己漲個記性。
class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
int xIndex = binarySearch(arr, x);
LinkedList<Integer> ans = new LinkedList<>();
int left = xIndex - 1;
int right = xIndex;
while (ans.size() < k) {
int disLeft = left >= 0 ? x - arr[left] : Integer.MAX_VALUE;
int disRight = right < arr.length ? arr[right] - x : Integer.MAX_VALUE;
if (disLeft <= disRight) {
ans.addFirst(arr[left]);
left--;
} else {
ans.add(arr[right]);
right++;
}
}
return ans;
}
private int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
right = mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
}
下面這個是大佬寫的,可以去看看解析,寫的太棒了:
https://leetcode-cn.com/problems/find-k-closest-elements/solution/pai-chu-fa-shuang-zhi-zhen-er-fen-fa-python-dai-ma/
public class Solution {
public List<Integer> findClosestElements(int[] arr, int k, int x) {
int size = arr.length;
int left = 0;
int right = size - k;
while (left < right) {
// int mid = left + (right - left) / 2;
int mid = (left + right) >>> 1;
// 嘗試從長度為 k + 1 的連續子區間刪除一個元素
// 從而定位左區間端點的邊界值
if (x - arr[mid] > arr[mid + k] - x) {
left = mid + 1;
} else {
right = mid;
}
}
List<Integer> res = new ArrayList<>();
for (int i = left; i < left + k; i++) {
res.add(arr[i]);
}
return res;
}
}
相關文章
- 找到k個最接近x的元素
- LeetCode每日一題--973. 最接近原點的 K 個點LeetCode每日一題
- Leetcode——347. 前K個高頻元素LeetCode
- 973-最接近原點的 K 個點
- LeetCode-215-陣列中的第K個最大元素LeetCode陣列
- 找到兩個陣列中的公共元素陣列
- 自學Java找到20k的工作Java
- 找到一個數最接近的比它大的2的n次冪的程式碼分析
- [演算法相關]973. 最接近原點的 K 個點演算法
- 最小的 k 個元素--快排變形
- 找到無序陣列中最小的k個數陣列
- 陣列中的第K個最大元素陣列
- [Leetcode]下一個更大元素IILeetCode
- LeetCode-230-二叉搜尋樹中第K小的元素LeetCode
- Leetcode230. 二叉搜尋樹中第K小的元素LeetCode
- 347. 前 K 個高頻元素
- leetcode-陣列中兩元素的最大乘積(Java)LeetCode陣列Java
- 23. 合併K個元素的有序連結串列
- 215. 陣列中的第K個最大元素陣列
- Leetcode 劍指 Offer 40. 最小的k個數LeetCode
- Leetcode 496. 下一個更大元素 ILeetCode
- LeetCode-496-下一個更大元素 ILeetCode
- 215、陣列中的第K個最大元素 | 演算法(leetcode,附思維導圖 + 全部解法)300題陣列演算法LeetCode
- 選擇問題(求第k個最小元素)
- java 兩個列表的元素是否相等且各自元素數量相等Java
- 獲取一個陣列裡面第K大的元素陣列
- 第k大元素
- 力扣-215. 陣列中的第K個最大元素力扣陣列
- LeetCode 402 移掉K位數字 HERODING的LeetCode之路LeetCode
- 347前 K 個高頻元素(雜湊表、堆排序)排序
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- leetcode23. 合併K個排序連結串列LeetCode排序
- [leetcode 25]. K 個一組翻轉連結串列LeetCode
- leetcode:確實的第一個整數(java)LeetCodeJava
- 【LeetCode】169. 多數元素LeetCode
- Java stream判斷列表是否包含某幾個元素/重複元素Java
- LeetCode題解(0692):前K個高頻單詞(Python)LeetCodePython
- LeetCode 25. k個一組翻轉連結串列LeetCode